diff --git a/docs/articles/basic_demo.html b/docs/articles/basic_demo.html new file mode 100644 index 0000000..13822e8 --- /dev/null +++ b/docs/articles/basic_demo.html @@ -0,0 +1,613 @@ + + +
+ + + + +Health departments commonly seek clusters of cases in space and time, +as cases occurring within similar time frames in nearby locations could +signal outbreaks or other events of public health importance. The input +data intended for the current package are typically counts of outcomes +for syndromic categories such as emergency department visits for +selected infectious diseases, overdoses, or other harms. However, the +package may be applied to seek clusters of other types of count data +whose observations have space and time descriptors. The following +paragraphs briefly summarize the cluster-finding method.
+The scan statistic is a widely used method for detecting clusters. +For a given outcome, the method works by testing many candidate regions +for high observed counts of that outcome and identifying regions with +unusually high counts relative to expected levels. In many applications +including the current one, expected counts are derived from a baseline +set of historical data. The most anomalous regions are then evaluated +for statistical significance and potential alerting. This approach is +implemented in the SaTScan software (www.satscan.org), which uses a +moving cylindrical window over space and time. The base of each cylinder +defines a geographic area, while its height represents a time interval. +For each cylinder, the observed number of cases is compared with the +expected count using a test statistic. The cylinder with the maximum +value of the scan statistic defines a candidate cluster.
+Because the distribution of the maximum scan statistic is not +available in closed form, SaTScan estimates statistical significance +using Monte Carlo simulation. That is, it repeatedly generates simulated +datasets under a null model and compares the observed cluster to this +reference distribution. The approach implemented in this package +replaces these repeated simulations with an immediate significance +assessment based on spline functions trained on a large set of archived +SaTScan results. The user chooses a spline corresponding to a +significance level; this spline defines a threshold for each possible +observed count. For each candidate cluster, an alert is issued if its +observed count exceeds the corresponding threshold. This method reduces +computation time while providing a practical approximation to the +standard SaTScan significance test, enabling rapid, on-demand cluster +detection across outcomes and time scales. The approach is faster than +using conventional repeated trials and provides epidemiologists with a +proxy method to obtain clusters on demand, for any outcome, and of any +duration.
+Requirements for this scan statistic implementation are:
+assignment of the observed data to geographic regions with +centroid point locations for distance calculations to enable expanding +cylinder scans
observed counts of the data in each region for each time +step
corresponding expected counts of the data, estimated from +baseline data
distances between the regions
The current package provides utilities for cluster detection on +location-date-count surveillance data. It supports:
+find_clusters(),This vignette demonstrates all exported functions, with emphasis on
+the recommended wrapper: find_clusters().
find_clusters() expects a data frame with at least these
+columns:
location: character location identifier,date: Date (or IDate)
+values,count: non-negative counts. Dates and locations with
+zero counts need not be provided. For many outcomes, counts are zero for
+the majority of locations in most dates and locations. The package code
+accounts for all date/location pairs.
+# use the built in example_count_data
+cases <- data.table::as.data.table(example_count_data)
+
+# For demonstration purposes, use only 12 unique locations
+locs <- unique(cases$location)[1:12]
+cases <- cases[location %in% locs]
+
+# For demonstration purposes only, keep the final 120 days only
+cases <- cases[date >= (max(date) - 120)]
+
+# Make sure that location is a character column
+cases[, location := as.character(location)]
+
+head(cases)
+#> location date count
+#> <char> <IDat> <int>
+#> 1: 39001 2024-10-08 4
+#> 2: 39001 2024-10-09 1
+#> 3: 39001 2024-10-10 0
+#> 4: 39001 2024-10-11 2
+#> 5: 39001 2024-10-12 0
+#> 6: 39003 2024-10-08 13The code below restricts the data to 12 locations for concise +demonstration. Using the full dataset will not impact computation +speed.
+Date helper functions:
+
+detect_date <- max(cases$date)
+get_test_dates(detect_date, test_length = 7)
+#> [1] "2025-01-30" "2025-01-31" "2025-02-01" "2025-02-02" "2025-02-03"
+#> [6] "2025-02-04" "2025-02-05"
+## For reference, but not usually needed in application:
+head(get_baseline_dates(detect_date, test_length = 7, baseline_length = 90, guard = 0))
+#> [1] "2024-11-01" "2024-11-02" "2024-11-03" "2024-11-04" "2024-11-05"
+#> [6] "2024-11-06"The scanning process requires distances between locations to enable +systematic scanning of expanding cylinders in space. This package +provides two ways to provide these distances:
+The functions tract_distance_matrix(),
+zip_distance_matrix() and
+county_distance_matrix() provide full pairwise distance
+matrices, which may be sparse with many zeros, depending on the user
+data:
+zip_dm <- zip_distance_matrix("DC")
+dim(zip_dm$distance_matrix)
+#> [1] 246 246
+
+county_dm <- county_distance_matrix("RI", source = "tigris")
+dim(county_dm$distance_matrix)
+#> [1] 5 5us_distance_matrix() is a special function available for
+generating pairwise distance between all U.S. counties, but is typically
+too large for routine examples:
+us_dm <- us_distance_matrix()
+dim(us_dm$distance_matrix)For applications with many hundreds of locations, the package
+function create_dist_list() returns a sparse neighbor
+representation. The output of this function is a list of vectors
+containing the nearby neighbor locations for
+each data location, where “nearby” means within a user-provided
+threshold. The example below returns a list of all counties within 25
+miles for every county in Rhode Island. This list is adequate for
+detection of clusters whose radius is at most 25 miles. For many
+outcomes, users do not seek clusters whose geographic extent exceed a
+threshold.
In summary, the matrix functions return all pairwise distances in a
+large, square matrix, while create_dist_list() returns only
+a sparse list of within-threshold neighbors (sparse list). The sparse
+lists are often faster/lighter for large geographies.
+county_list <- create_dist_list(
+ level = "county",
+ st = "RI",
+ threshold = 25
+)
+length(county_list)
+#> [1] 5
+head(county_list[[1]])
+#> 44009 44005 44003
+#> 0.00000 18.89133 19.34145find_clusters()
+The primary user-facing function is find_clusters. This
+function executes the following component steps:
For any distance object (matrix or sparse list), location names must
+match the location column in your case data.
find_clusters()
+| Parameter | +Purpose | +Comment | +
|---|---|---|
cases |
+Input location-date-count data | +Include only rows whose count is positive. | +
distance_matrix |
+Named matrix (dense) or named list (sparse) of distances | +Used for scanning to include progressively closer locations. | +
detect_date |
+End date for the detection window | +Function will return only clusters ending on this date. | +
spline_lookup |
+Spline threshold table (NULL, built-ins
+"05", "01", "005",
+"001", or custom frame) |
+Derived from SaTScan cluster output runs with p-values of 0.05, +0.01, 0.005, and 0.001, to emulate those sensitivity requirements | +
baseline_length |
+Number of days in baseline period | +Default is 90 days; can use larger intervals if available in
+cases. |
+
max_test_window_days |
+Maximum test window size (days) | +Number of days that a cluster can include, i.e. max cylinder +height. | +
guard_band |
+Gap between baseline and test windows | +Default is 0 days; can be used to separate test window from +baseline. | +
distance_limit |
+Max cluster radius in same units as distances | +Mean maximum distance from centroid to cluster members. | +
baseline_adjustment |
+Expected-value handling ("add_one",
+"add_one_global", "add_test",
+"none") |
+Select “add-test” to agree with SaTScan space-time permutation +option “add-one” to add a baseline count when needed | +
adj_constant |
+Constant used when adjustment requires additive offset | +default=1; constant added for “add_one” options to avoid division by +zero | +
+min_clust_cases / max_clust_cases
+ |
+Pre-compression observed-count filters | +to put a minimum or maximum on number of cluster cases | +
return_interim |
+Return intermediate objects for debugging/inspection | +Lets user inspect intermediate data tables. | +
This package also provides a function st_injects() to
+create artificial cluster signals for addition to background data in
+order to test and evaluate the detection capability of the
+find_clusters’ method. A subsequent vignette will provide
+details on st_injects(). To create a clear demonstration
+signal, inject a small synthetic cluster first:
+set.seed(42)
+inj <- st_injects(
+ cases = cases,
+ distance_matrix = dm,
+ target_loc = locs[1],
+ center_decile = 5,
+ radius_miles = 10,
+ nr_cases = 40,
+ nr_days = 3,
+ end_date = detect_date
+)
+
+cases_inj <- inj$case_counts_inj
+nearby <- get_nearby_locations(locs[1], dm, radius_miles = 10)
+head(nearby)
+#> nearby_locs distance_mi
+#> <char> <num>
+#> 1: 39001 0
+#> 2: 39003 5
+#> 3: 39005 10The package ships with spline lookup tables. For observed cluster +counts, tables provide significance thresholds approximating p-values of +0.001, 0.005, 0.01, and 0.05:
+spline_001spline_005spline_01spline_05and demonstration data with tables of county and zip code locations +and shape files:
+example_count_datacountieszipcodesThese can be used directly in workflows, examples, and tests.
+
+library(gsClusterDetect)
+library(dplyr)
+library(ggplot2)
+library(tigris)
+library(sf)
+
+options(tigris_use_cache = TRUE)
+
+# Use example count data to find clusters
+d <- example_count_data
+dd <- d[, max(date)]
+dm <- create_dist_list("county", st="OH", threshold = 50, )
+cl <- find_clusters(d,dm,dd)
+# Join locations/clusters to tigris counties shape file
+oh <- counties("OH", cb = TRUE, class = "sf") |>
+ left_join(cl$cluster_location_counts, by = c("GEOID" = "location"))
+
+# Find the number of significant clusters
+n_groups <- nrow(cl$cluster_alert_table)
+# Get that number of shades of blue
+blue_vals <- setNames(
+ colorRampPalette(c("lightblue", "darkblue"))(n_groups),
+ sort(unique(na.omit(oh$target)))
+)
+
+# Make a simple map of the shape file,
+# filling with the target, and then coloring the fill-values
+# with the blue vals
+ggplot(oh) +
+ geom_sf(aes(fill = target), color = "black", linewidth = 0.2) +
+ scale_fill_manual(values = blue_vals, na.value = NA) +
+ theme_void() +
+ theme(legend.position = "none")
Create statistical summary of input data:
+
+summary_tbl <- generate_summary_table(
+ data = cases_inj,
+ end_date = detect_date,
+ baseline_length = 90,
+ test_length = 7
+)
+summary_tbl
+#> Statistic (rounded means) Baseline Interval Test Interval
+#> <char> <num> <num>
+#> 1: Nr. Dates 90.0 7.0
+#> 2: Nr. Total Cases 6683.0 1489.0
+#> 3: Cases per Day 74.3 212.7
+#> 4: Nr. Locations with Data 12.0 12.0
+#> 5: Nr. Locations, no records 0.0 0.0
+#> 6: Nr. Locs, daily mean 1 or less 1.0 1.0
+#> 7: Nr. Locs, daily mean 2 2.0 1.0
+#> 8: Nr. Locs, daily mean 3-5 4.0 0.0
+#> 9: Nr. Locs, daily mean 6-10 2.0 5.0
+#> 10: Nr. Locs, daily mean >10 3.0 5.0Create visual heatmap summary of input data to assess suitability for +cluster detection. This plot illustrates spread of data counts over +locations:
+
+heatmap_data <- generate_heatmap_data(
+ data = cases_inj,
+ end_date = detect_date,
+ baseline_length = 90,
+ test_length = 7
+)
+
+p_heat <- generate_heatmap(heatmap_data, plot_type = "plotly")
+class(p_heat)
+#> [1] "plotly" "htmlwidget"
+p_heatCreate time series of aggregated data counts over all locations:
+
+ts_data <- generate_time_series_data(
+ data = cases_inj,
+ end_date = detect_date,
+ baseline_length = 90,
+ test_length = 7
+)
+
+p_ts <- generate_time_series_plot(ts_data, plot_type = "plotly")
+class(p_ts)
+#> [1] "plotly" "htmlwidget"
+p_tsInspect intermediate objects:
+
+interim <- find_clusters(
+ cases = cases_inj,
+ distance_matrix = dm,
+ detect_date = detect_date,
+ return_interim = TRUE
+)
+
+names(interim)
+#> [1] "case_grid_info" "nearby_case_info"
+#> [3] "obs_expected_frame" "obs_expected_frame_with_spline"
+#> [5] "compressed_clusters" "result"These are used by the find_clusters() function and may
+be useful for custom diagnostics and method development.
+cg <- generate_case_grids(
+ cases = cases_inj,
+ detect_date = detect_date,
+ baseline_length = 90,
+ max_test_window_days = 7
+)
+
+nci <- gen_nearby_case_info(
+ cg = cg,
+ distance_matrix = dm,
+ distance_limit = 15
+)
+
+oe <- generate_observed_expected(
+ nearby_counts = nci,
+ case_grid = cg,
+ adjust = TRUE,
+ adj_constant = 1
+)
+
+cat_tbl <- add_spline_threshold(oe_grid = oe, spline_lookup = "01")o+d&&(a+=1,e=s.x0),o=s.x0,i[a]||(i[a]=[]),i[a].push(s),r=e-s.x0,s.x0+=r,s.x1+=r}return i}(y=A.nodes).forEach(function(t){var e,r,n,i=0,a=t.length;for(t.sort(function(t,e){return t.y0-e.y0}),n=0;n=i||(r=i-e.y0)>1e-6&&(e.y0+=r,e.y1+=r),i=e.y1+p}),n.update(A)}return{circular:b,key:r,trace:a,guid:h.randstr(),horizontal:f,width:v,height:g,nodePad:a.node.pad,nodeLineColor:a.node.line.color,nodeLineWidth:a.node.line.width,linkLineColor:a.link.line.color,linkLineWidth:a.link.line.width,linkArrowLength:a.link.arrowlen,valueFormat:a.valueformat,valueSuffix:a.valuesuffix,textFont:a.textfont,translateX:c.x[0]*t.width+t.margin.l,translateY:t.height-c.y[1]*t.height+t.margin.t,dragParallel:f?g:v,dragPerpendicular:f?v:g,arrangement:a.arrangement,sankey:n,graph:A,forceLayouts:{},interactionState:{dragInProgress:!1,hovered:!1}}}function k(t,e,r){var n=u(e.color),i=e.source.label+"|"+e.target.label+"__"+r;return e.trace=t.trace,e.curveNumber=t.trace.index,{circular:t.circular,key:i,traceId:t.key,pointNumber:e.pointNumber,link:e,tinyColorHue:c.tinyRGB(n),tinyColorAlpha:n.getAlpha(),linkPath:M,linkLineColor:t.linkLineColor,linkLineWidth:t.linkLineWidth,linkArrowLength:t.linkArrowLength,valueFormat:t.valueFormat,valueSuffix:t.valueSuffix,sankey:t.sankey,parent:t,interactionState:t.interactionState,flow:e.flow}}function M(){return function(t){var e=t.linkArrowLength;if(t.link.circular)return function(t,e){var r=t.width/2,n=t.circularPathData;return"top"===t.circularLinkType?"M "+(n.targetX-e)+" "+(n.targetY+r)+" L"+(n.rightInnerExtent-e)+" "+(n.targetY+r)+"A"+(n.rightLargeArcRadius+r)+" "+(n.rightSmallArcRadius+r)+" 0 0 1 "+(n.rightFullExtent-r-e)+" "+(n.targetY-n.rightSmallArcRadius)+"L"+(n.rightFullExtent-r-e)+" "+n.verticalRightInnerExtent+"A"+(n.rightLargeArcRadius+r)+" "+(n.rightLargeArcRadius+r)+" 0 0 1 "+(n.rightInnerExtent-e)+" "+(n.verticalFullExtent-r)+"L"+n.leftInnerExtent+" "+(n.verticalFullExtent-r)+"A"+(n.leftLargeArcRadius+r)+" "+(n.leftLargeArcRadius+r)+" 0 0 1 "+(n.leftFullExtent+r)+" "+n.verticalLeftInnerExtent+"L"+(n.leftFullExtent+r)+" "+(n.sourceY-n.leftSmallArcRadius)+"A"+(n.leftLargeArcRadius+r)+" "+(n.leftSmallArcRadius+r)+" 0 0 1 "+n.leftInnerExtent+" "+(n.sourceY+r)+"L"+n.sourceX+" "+(n.sourceY+r)+"L"+n.sourceX+" "+(n.sourceY-r)+"L"+n.leftInnerExtent+" "+(n.sourceY-r)+"A"+(n.leftLargeArcRadius-r)+" "+(n.leftSmallArcRadius-r)+" 0 0 0 "+(n.leftFullExtent-r)+" "+(n.sourceY-n.leftSmallArcRadius)+"L"+(n.leftFullExtent-r)+" "+n.verticalLeftInnerExtent+"A"+(n.leftLargeArcRadius-r)+" "+(n.leftLargeArcRadius-r)+" 0 0 0 "+n.leftInnerExtent+" "+(n.verticalFullExtent+r)+"L"+(n.rightInnerExtent-e)+" "+(n.verticalFullExtent+r)+"A"+(n.rightLargeArcRadius-r)+" "+(n.rightLargeArcRadius-r)+" 0 0 0 "+(n.rightFullExtent+r-e)+" "+n.verticalRightInnerExtent+"L"+(n.rightFullExtent+r-e)+" "+(n.targetY-n.rightSmallArcRadius)+"A"+(n.rightLargeArcRadius-r)+" "+(n.rightSmallArcRadius-r)+" 0 0 0 "+(n.rightInnerExtent-e)+" "+(n.targetY-r)+"L"+(n.targetX-e)+" "+(n.targetY-r)+(e>0?"L"+n.targetX+" "+n.targetY:"")+"Z":"M "+(n.targetX-e)+" "+(n.targetY-r)+" L"+(n.rightInnerExtent-e)+" "+(n.targetY-r)+"A"+(n.rightLargeArcRadius+r)+" "+(n.rightSmallArcRadius+r)+" 0 0 0 "+(n.rightFullExtent-r-e)+" "+(n.targetY+n.rightSmallArcRadius)+"L"+(n.rightFullExtent-r-e)+" "+n.verticalRightInnerExtent+"A"+(n.rightLargeArcRadius+r)+" "+(n.rightLargeArcRadius+r)+" 0 0 0 "+(n.rightInnerExtent-e)+" "+(n.verticalFullExtent+r)+"L"+n.leftInnerExtent+" "+(n.verticalFullExtent+r)+"A"+(n.leftLargeArcRadius+r)+" "+(n.leftLargeArcRadius+r)+" 0 0 0 "+(n.leftFullExtent+r)+" "+n.verticalLeftInnerExtent+"L"+(n.leftFullExtent+r)+" "+(n.sourceY+n.leftSmallArcRadius)+"A"+(n.leftLargeArcRadius+r)+" "+(n.leftSmallArcRadius+r)+" 0 0 0 "+n.leftInnerExtent+" "+(n.sourceY-r)+"L"+n.sourceX+" "+(n.sourceY-r)+"L"+n.sourceX+" "+(n.sourceY+r)+"L"+n.leftInnerExtent+" "+(n.sourceY+r)+"A"+(n.leftLargeArcRadius-r)+" "+(n.leftSmallArcRadius-r)+" 0 0 1 "+(n.leftFullExtent-r)+" "+(n.sourceY+n.leftSmallArcRadius)+"L"+(n.leftFullExtent-r)+" "+n.verticalLeftInnerExtent+"A"+(n.leftLargeArcRadius-r)+" "+(n.leftLargeArcRadius-r)+" 0 0 1 "+n.leftInnerExtent+" "+(n.verticalFullExtent-r)+"L"+(n.rightInnerExtent-e)+" "+(n.verticalFullExtent-r)+"A"+(n.rightLargeArcRadius-r)+" "+(n.rightLargeArcRadius-r)+" 0 0 1 "+(n.rightFullExtent+r-e)+" "+n.verticalRightInnerExtent+"L"+(n.rightFullExtent+r-e)+" "+(n.targetY+n.rightSmallArcRadius)+"A"+(n.rightLargeArcRadius-r)+" "+(n.rightSmallArcRadius-r)+" 0 0 1 "+(n.rightInnerExtent-e)+" "+(n.targetY+r)+"L"+(n.targetX-e)+" "+(n.targetY+r)+(e>0?"L"+n.targetX+" "+n.targetY:"")+"Z"}(t.link,e);var r=Math.abs((t.link.target.x0-t.link.source.x1)/2);e>r&&(e=r);var n=t.link.source.x1,a=t.link.target.x0-e,o=i(n,a),s=o(.5),l=o(.5),u=t.link.y0-t.link.width/2,c=t.link.y0+t.link.width/2,f=t.link.y1-t.link.width/2,h=t.link.y1+t.link.width/2,p="M"+n+","+u,d="C"+s+","+u+" "+l+","+f+" "+a+","+f,v="C"+l+","+h+" "+s+","+c+" "+n+","+c,g=e>0?"L"+(a+e)+","+(f+t.link.width/2):"";return p+d+(g+="L"+a+","+h)+v+"Z"}}function S(t,e){var r=u(e.color),n=l.nodePadAcross,i=t.nodePad/2;e.dx=e.x1-e.x0,e.dy=e.y1-e.y0;var a=e.dx,o=Math.max(.5,e.dy),s="node_"+e.pointNumber;return e.group&&(s=h.randstr()),e.trace=t.trace,e.curveNumber=t.trace.index,{index:e.pointNumber,key:s,partOfGroup:e.partOfGroup||!1,group:e.group,traceId:t.key,trace:t.trace,node:e,nodePad:t.nodePad,nodeLineColor:t.nodeLineColor,nodeLineWidth:t.nodeLineWidth,textFont:t.textFont,size:t.horizontal?t.height:t.width,visibleWidth:Math.ceil(a),visibleHeight:o,zoneX:-n,zoneY:-i,zoneWidth:a+2*n,zoneHeight:o+2*i,labelY:t.horizontal?e.dy/2+1:e.dx/2+1,left:1===e.originalLayer,sizeAcross:t.width,forceLayouts:t.forceLayouts,horizontal:t.horizontal,darkBackground:r.getBrightness()<=128,tinyColorHue:c.tinyRGB(r),tinyColorAlpha:r.getAlpha(),valueFormat:t.valueFormat,valueSuffix:t.valueSuffix,sankey:t.sankey,graph:t.graph,arrangement:t.arrangement,uniqueNodeLabelPathId:[t.guid,t.key,s].join("_"),interactionState:t.interactionState,figure:t}}function E(t){t.attr("transform",function(t){return p(t.node.x0.toFixed(3),t.node.y0.toFixed(3))})}function L(t){t.call(E)}function C(t,e){t.call(L),e.attr("d",M())}function P(t){t.attr("width",function(t){return t.node.x1-t.node.x0}).attr("height",function(t){return t.visibleHeight})}function O(t){return t.link.width>1||t.linkLineWidth>0}function I(t){return p(t.translateX,t.translateY)+(t.horizontal?"matrix(1 0 0 1 0 0)":"matrix(0 1 1 0 0 0)")}function D(t,e,r){t.on(".basic",null).on("mouseover.basic",function(t){t.interactionState.dragInProgress||t.partOfGroup||(r.hover(this,t,e),t.interactionState.hovered=[this,t])}).on("mousemove.basic",function(t){t.interactionState.dragInProgress||t.partOfGroup||(r.follow(this,t),t.interactionState.hovered=[this,t])}).on("mouseout.basic",function(t){t.interactionState.dragInProgress||t.partOfGroup||(r.unhover(this,t,e),t.interactionState.hovered=!1)}).on("click.basic",function(t){t.interactionState.hovered&&(r.unhover(this,t,e),t.interactionState.hovered=!1),t.interactionState.dragInProgress||t.partOfGroup||r.select(this,t,e)})}function z(t,e,r,i){var o=a.behavior.drag().origin(function(t){return{x:t.node.x0+t.visibleWidth/2,y:t.node.y0+t.visibleHeight/2}}).on("dragstart",function(a){if("fixed"!==a.arrangement&&(h.ensureSingle(i._fullLayout._infolayer,"g","dragcover",function(t){i._fullLayout._dragCover=t}),h.raiseToTop(this),a.interactionState.dragInProgress=a.node,F(a.node),a.interactionState.hovered&&(r.nodeEvents.unhover.apply(0,a.interactionState.hovered),a.interactionState.hovered=!1),"snap"===a.arrangement)){var o=a.traceId+"|"+a.key;a.forceLayouts[o]?a.forceLayouts[o].alpha(1):function(t,e,r){!function(t){for(var e=0;e =n.length)return t;var r=[],a=i[e++];return t.forEach(function(t,n){r.push({key:t,values:s(n,e)})}),a?r.sort(function(t,e){return a(t.key,e.key)}):r}return r.map=function(t,e){return o(e,t,0)},r.entries=function(t){return s(o(a.map,t,0),0)},r.key=function(t){return n.push(t),r},r.sortKeys=function(t){return i[n.length-1]=t,r},r.sortValues=function(e){return t=e,r},r.rollup=function(t){return e=t,r},r},a.set=function(t){var e=new O;if(t)for(var r=0,n=t.length;r 360?t-=360:t<0&&(t+=360),t<60?n+(i-n)*t/60:t<180?i:t<240?n+(i-n)*(240-t)/60:n}(t))}return t=isNaN(t)?0:(t%=360)<0?t+360:t,e=isNaN(e)||e<0?0:e>1?1:e,n=2*(r=r<0?0:r>1?1:r)-(i=r<=.5?r*(1+e):r+e-r*e),new ie(a(t+120),a(t),a(t-120))}function Gt(t,e,r){return this instanceof Gt?(this.h=+t,this.c=+e,void(this.l=+r)):arguments.length<2?t instanceof Gt?new Gt(t.h,t.c,t.l):function(t,e,r){return t>0?new Gt(Math.atan2(r,e)*It,Math.sqrt(e*e+r*r),t):new Gt(NaN,NaN,t)}(t instanceof Zt?t.l:(t=fe((t=a.rgb(t)).r,t.g,t.b)).l,t.a,t.b):new Gt(t,e,r)}Ht.brighter=function(t){return t=Math.pow(.7,arguments.length?t:1),new Vt(this.h,this.s,this.l/t)},Ht.darker=function(t){return t=Math.pow(.7,arguments.length?t:1),new Vt(this.h,this.s,t*this.l)},Ht.rgb=function(){return qt(this.h,this.s,this.l)},a.hcl=Gt;var Yt=Gt.prototype=new Ut;function Wt(t,e,r){return isNaN(t)&&(t=0),isNaN(e)&&(e=0),new Zt(r,Math.cos(t*=Ot)*e,Math.sin(t)*e)}function Zt(t,e,r){return this instanceof Zt?(this.l=+t,this.a=+e,void(this.b=+r)):arguments.length<2?t instanceof Zt?new Zt(t.l,t.a,t.b):t instanceof Gt?Wt(t.h,t.c,t.l):fe((t=ie(t)).r,t.g,t.b):new Zt(t,e,r)}Yt.brighter=function(t){return new Gt(this.h,this.c,Math.min(100,this.l+Xt*(arguments.length?t:1)))},Yt.darker=function(t){return new Gt(this.h,this.c,Math.max(0,this.l-Xt*(arguments.length?t:1)))},Yt.rgb=function(){return Wt(this.h,this.c,this.l).rgb()},a.lab=Zt;var Xt=18,Jt=.95047,Kt=1,$t=1.08883,Qt=Zt.prototype=new Ut;function te(t,e,r){var n=(t+16)/116,i=n+e/500,a=n-r/200;return new ie(ne(3.2404542*(i=ee(i)*Jt)-1.5371385*(n=ee(n)*Kt)-.4985314*(a=ee(a)*$t)),ne(-.969266*i+1.8760108*n+.041556*a),ne(.0556434*i-.2040259*n+1.0572252*a))}function ee(t){return t>.206893034?t*t*t:(t-4/29)/7.787037}function re(t){return t>.008856?Math.pow(t,1/3):7.787037*t+4/29}function ne(t){return Math.round(255*(t<=.00304?12.92*t:1.055*Math.pow(t,1/2.4)-.055))}function ie(t,e,r){return this instanceof ie?(this.r=~~t,this.g=~~e,void(this.b=~~r)):arguments.length<2?t instanceof ie?new ie(t.r,t.g,t.b):ue(""+t,ie,qt):new ie(t,e,r)}function ae(t){return new ie(t>>16,t>>8&255,255&t)}function oe(t){return ae(t)+""}Qt.brighter=function(t){return new Zt(Math.min(100,this.l+Xt*(arguments.length?t:1)),this.a,this.b)},Qt.darker=function(t){return new Zt(Math.max(0,this.l-Xt*(arguments.length?t:1)),this.a,this.b)},Qt.rgb=function(){return te(this.l,this.a,this.b)},a.rgb=ie;var se=ie.prototype=new Ut;function le(t){return t<16?"0"+Math.max(0,t).toString(16):Math.min(255,t).toString(16)}function ue(t,e,r){var n,i,a,o=0,s=0,l=0;if(n=/([a-z]+)\((.*)\)/.exec(t=t.toLowerCase()))switch(i=n[2].split(","),n[1]){case"hsl":return r(parseFloat(i[0]),parseFloat(i[1])/100,parseFloat(i[2])/100);case"rgb":return e(pe(i[0]),pe(i[1]),pe(i[2]))}return(a=de.get(t))?e(a.r,a.g,a.b):(null==t||"#"!==t.charAt(0)||isNaN(a=parseInt(t.slice(1),16))||(4===t.length?(o=(3840&a)>>4,o|=o>>4,s=240&a,s|=s>>4,l=15&a,l|=l<<4):7===t.length&&(o=(16711680&a)>>16,s=(65280&a)>>8,l=255&a)),e(o,s,l))}function ce(t,e,r){var n,i,a=Math.min(t/=255,e/=255,r/=255),o=Math.max(t,e,r),s=o-a,l=(o+a)/2;return s?(i=l<.5?s/(o+a):s/(2-o-a),n=t==o?(e-r)/s+(e =f[0]&&l<=f[1]&&((s=u[a.bisect(h,l,1,d)-1]).y+=v,s.push(i[o]));return u}return i.value=function(t){return arguments.length?(e=t,i):e},i.range=function(t){return arguments.length?(r=ve(t),i):r},i.bins=function(t){return arguments.length?(n="number"==typeof t?function(e){return Tn(e,t)}:ve(t),i):n},i.frequency=function(e){return arguments.length?(t=!!e,i):t},i},a.layout.pack=function(){var t,e=a.layout.hierarchy().sort(kn),r=0,n=[1,1];function i(i,a){var o=e.call(this,i,a),s=o[0],l=n[0],u=n[1],c=null==t?Math.sqrt:"function"==typeof t?t:function(){return t};if(s.x=s.y=0,on(s,function(t){t.r=+c(t.value)}),on(s,Ln),r){var f=r*(t?1:Math.max(2*s.r/l,2*s.r/u))/2;on(s,function(t){t.r+=f}),on(s,Ln),on(s,function(t){t.r-=f})}return On(s,l/2,u/2,t?1:1/Math.max(2*s.r/l,2*s.r/u)),o}return i.size=function(t){return arguments.length?(n=t,i):n},i.radius=function(e){return arguments.length?(t=null==e||"function"==typeof e?e:+e,i):t},i.padding=function(t){return arguments.length?(r=+t,i):r},nn(i,e)},a.layout.tree=function(){var t=a.layout.hierarchy().sort(null).value(null),e=Dn,r=[1,1],n=null;function i(i,a){var u=t.call(this,i,a),c=u[0],f=function(t){for(var e,r={A:null,children:[t]},n=[r];null!=(e=n.pop());)for(var i,a=e.children,o=0,s=a.length;o
")}var A=s.castOption(r,c.i,"texttemplate");if(!A)return"";var k={};c.label&&(k.label=c.label),c.hasOwnProperty("v")&&(k.value=c.v,k.valueLabel=b.formatValue(c.v,l)),k.currentPath=b.getPath(t.data),h||(k.percentParent=d/b.getValue(p),k.percentParentLabel=b.formatPercent(k.percentParent,l),k.parent=b.getPtLabel(p)),k.percentEntry=d/b.getValue(e),k.percentEntryLabel=b.formatPercent(k.percentEntry,l),k.entry=b.getPtLabel(e),k.percentRoot=d/b.getValue(f),k.percentRootLabel=b.formatPercent(k.percentRoot,l),k.root=b.getPtLabel(f),c.hasOwnProperty("color")&&(k.color=c.color);var M=s.castOption(r,c.i,"text");return(s.isValidTextValue(M)||""===M)&&(k.text=M),k.customdata=s.castOption(r,c.i,"customdata"),s.texttemplateString(A,k,i._d3locale,k,r._meta||{})}},2362:function(t){"use strict";t.exports=JSON.parse('["normal","condensed","semi-condensed","extra-condensed","ultra-condensed","expanded","semi-expanded","extra-expanded","ultra-expanded"]')},2378:function(t,e,r){"use strict";var n=r(6624);e._doPlot=n._doPlot,e.newPlot=n.newPlot,e.restyle=n.restyle,e.relayout=n.relayout,e.redraw=n.redraw,e.update=n.update,e._guiRestyle=n._guiRestyle,e._guiRelayout=n._guiRelayout,e._guiUpdate=n._guiUpdate,e._storeDirectGUIEdit=n._storeDirectGUIEdit,e.react=n.react,e.extendTraces=n.extendTraces,e.prependTraces=n.prependTraces,e.addTraces=n.addTraces,e.deleteTraces=n.deleteTraces,e.moveTraces=n.moveTraces,e.purge=n.purge,e.addFrames=n.addFrames,e.deleteFrames=n.deleteFrames,e.animate=n.animate,e.setPlotConfig=n.setPlotConfig;var i=r(72565).getGraphDiv,a=r(87099).eraseActiveShape;e.deleteActiveShape=function(t){return a(i(t))},e.toImage=r(25103),e.validate=r(51326),e.downloadImage=r(68552);var o=r(46745);e.makeTemplate=o.makeTemplate,e.validateTemplate=o.validateTemplate},2463:function(t,e,r){"use strict";var n=r(46982),i=r(26446),a=r(15181),o=r(13800);t.exports=function(t,e,r){function s(r,n){return a.coerce(t,e,o,r,n)}for(var l=!1,u=!1,c=!1,f={},h=s("barmode"),p=0;p
/i;e.BR_TAG_ALL=/
/gi;var _=/(^|[\s"'])style\s*=\s*("([^"]*);?"|'([^']*);?')/i,w=/(^|[\s"'])href\s*=\s*("([^"]*)"|'([^']*)')/i,T=/(^|[\s"'])target\s*=\s*("([^"\s]*)"|'([^'\s]*)')/i,A=/(^|[\s"'])popup\s*=\s*("([\w=,]*)"|'([\w=,]*)')/i;function k(t,e){if(!t)return null;var r=t.match(e),n=r&&(r[3]||r[4]);return n&&L(n)}var M=/(^|;)\s*color:/;e.plainText=function(t,e){for(var r=void 0!==(e=e||{}).len&&-1!==e.len?e.len:1/0,n=void 0!==e.allowedTags?e.allowedTags:["br"],i=t.split(m),a=[],o="",s=0,l=0;l
")}(e,r,n,i):v.getValue(s.text,r),v.coerceString(m,o)}(C,n,i,T,M);w=function(t,e){var r=v.getValue(t.textposition,e);return v.coerceEnumerated(x,r)}(O,i);var z="stack"===g.mode||"relative"===g.mode,R=n[i],F=!z||R._outmost;if(D&&"none"!==w&&(!R.isBlank&&s!==u&&f!==p||"auto"!==w&&"inside"!==w)){var B=C.font,N=d.getBarColor(n[i],O),j=d.getInsideTextFont(O,i,B,N),U=d.getOutsideTextFont(O,i,B),V=r.datum();I?"log"===T.type&&V.s0<=0&&(s=T.range[0]
").length;i=B.t+et*a+10-J-w*yt*l}_t((o?"h":"v")+lt._id+"title",{avoid:{selection:n.select(r).selectAll("g."+lt._id+"tick"),side:V,offsetTop:o?0:B.t,offsetLeft:o?B.l:0,maxShift:o?F.width:F.height},attributes:{x:t,y:i,"text-anchor":"middle"},transform:{rotate:o?-90:0,offset:0}})}},a.previousPromises,function(){var n,s=J+M/2;-1===gt.indexOf("inside")&&(n=p.bBox(mt.node()),s+=o?n.width:n.height),dt=vt.select("text");var u=0,f=o&&"top"===V,v=!o&&"right"===V,g=0;if(dt.node()&&!dt.classed(k.jsPlaceholder)){var m,x=vt.select(".h"+lt._id+"title-math-group").node();x&&(o&&ut||!o&&!ut)?(u=(n=p.bBox(x)).width,m=n.height):(u=(n=p.bBox(vt.node())).right-B.l-(o?rt:st),m=n.bottom-B.t-(o?st:rt),o||"top"!==V||(s+=n.height,g=n.height)),v&&(dt.attr("transform",c(u/2+yt/2,0)),u*=2),s=Math.max(s,o?u:m)}var b=2*(o?P:O)+s+S+M/2,w=0;!o&&U.text&&"bottom"===C&&D<=0&&(b+=w=b/2,g+=w),F._hColorbarMoveTitle=w,F._hColorbarMoveCBTitle=g;var N=S+M,j=(o?rt:st)-N/2-(o?P:0),H=(o?st:rt)-(o?$:O+g-w);t.select("."+k.cbbg).attr("x",j).attr("y",H).attr(o?"width":"height",Math.max(b-w,2)).attr(o?"height":"width",Math.max($+N,2)).call(d.fill,E).call(d.stroke,e.bordercolor).style("stroke-width",S);var q=v?Math.max(u-10,0):0;t.selectAll("."+k.cboutline).attr("x",(o?rt:st+P)+q).attr("y",(o?st+O-$:rt)+(f?xt:0)).attr(o?"width":"height",Math.max(J,2)).attr(o?"height":"width",Math.max($-(o?2*O+xt:2*P+q),2)).call(d.stroke,e.outlinecolor).style({fill:"none","stroke-width":M});var G=o?nt*b:0,Y=o?0:(1-it)*b-g;if(G=R?B.l-G:-G,Y=z?B.t-Y:-Y,t.attr("transform",c(G,Y)),!o&&(S||i(E).getAlpha()&&!i.equals(F.paper_bgcolor,E))){var W=mt.selectAll("text"),Z=W[0].length,X=t.select("."+k.cbbg).node(),K=p.bBox(X),Q=p.getTranslate(t);W.each(function(t,e){var r=Z-1;if(0===e||e===r){var n,i=p.bBox(this),a=p.getTranslate(this);if(e===r){var o=i.right+a.x;(n=K.right+Q.x+st-S-2+I-o)>0&&(n=0)}else if(0===e){var s=i.left+a.x;(n=K.left+Q.x+st+S+2-s)<0&&(n=0)}n&&(Z<3?this.setAttribute("transform","translate("+n+",0) "+this.getAttribute("transform")):this.setAttribute("visibility","hidden"))}})}var tt={},et=T[L],at=A[L],ot=T[C],ct=A[C],ft=b-J;o?("pixels"===h?(tt.y=D,tt.t=$*ot,tt.b=$*ct):(tt.t=tt.b=0,tt.yt=D+l*ot,tt.yb=D-l*ct),"pixels"===_?(tt.x=I,tt.l=b*et,tt.r=b*at):(tt.l=ft*et,tt.r=ft*at,tt.xl=I-y*et,tt.xr=I+y*at)):("pixels"===h?(tt.x=I,tt.l=$*et,tt.r=$*at):(tt.l=tt.r=0,tt.xl=I+l*et,tt.xr=I-l*at),"pixels"===_?(tt.y=1-D,tt.t=b*ot,tt.b=b*ct):(tt.t=ft*ot,tt.b=ft*ct,tt.yt=D-y*ot,tt.yb=D+y*ct));var ht=e.y<.5?"b":"t",pt=e.x<.5?"l":"r";r._fullLayout._reservedMargin[e._id]={};var bt={r:F.width-j-G,l:j+tt.r,b:F.height-H-Y,t:H+tt.b};R&&z?a.autoMargin(r,e._id,tt):R?r._fullLayout._reservedMargin[e._id][ht]=bt[ht]:z||o?r._fullLayout._reservedMargin[e._id][pt]=bt[pt]:r._fullLayout._reservedMargin[e._id][ht]=bt[ht]}],r)}(r,e,t);y&&y.then&&(t._promises||[]).push(y),t._context.edits.colorbarPosition&&function(t,e,r){var n,i,a,s="v"===e.orientation,u=r._fullLayout._size;l.init({element:t.node(),gd:r,prepFn:function(){n=t.attr("transform"),h(t)},moveFn:function(r,o){t.attr("transform",n+c(r,o)),i=l.align((s?e._uFrac:e._vFrac)+r/u.w,s?e._thickFrac:e._lenFrac,0,1,e.xanchor),a=l.align((s?e._vFrac:1-e._uFrac)-o/u.h,s?e._lenFrac:e._thickFrac,0,1,e.yanchor);var f=l.getCursor(i,a,e.xanchor,e.yanchor);h(t,f)},doneFn:function(){if(h(t),void 0!==i&&void 0!==a){var n={};n[e._propPrefix+"x"]=i,n[e._propPrefix+"y"]=a,void 0!==e._traceIndex?o.call("_guiRestyle",r,n,e._traceIndex):o.call("_guiRelayout",r,n)}}})}(r,e,t)}),e.exit().each(function(e){a.autoMargin(t,e._id)}).remove(),e.order()}}},4630:function(t){t.exports=function(t,e){return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=e[0],t[13]=e[1],t[14]=e[2],t[15]=1,t}},4814:function(t,e,r){"use strict";var n=r(20454);t.exports=function(t){if(!n(t))throw new TypeError(t+" is not an Object");return t}},4824:function(t,e,r){"use strict";var n=r(16534),i=r(15181);t.exports=function(t,e,r,a){var o=e.yaxis,s=e.xaxis,l=!!s.rangebreaks;i.makeTraceGroups(a,r,"trace ohlc").each(function(t){var e=n.select(this),r=t[0],a=r.t;if(!0!==r.trace.visible||a.empty)e.remove();else{var u=a.tickLen,c=e.selectAll("path").data(i.identity);c.enter().append("path"),c.exit().remove(),c.attr("d",function(t){if(t.empty)return"M0,0Z";var e=s.c2p(t.pos-u,!0),r=s.c2p(t.pos+u,!0),n=l?(e+r)/2:s.c2p(t.pos,!0);return"M"+e+","+o.c2p(t.o,!0)+"H"+n+"M"+n+","+o.c2p(t.h,!0)+"V"+o.c2p(t.l,!0)+"M"+r+","+o.c2p(t.c,!0)+"H"+n})}})}},4840:function(t){t.exports=function(t,e,r){var n=[],i=[];return t.forEach(function(t){var a=t.start,o=t.end;if(e.pointsSame(a,o))console.warn("PolyBool: Warning: Zero-length segment detected; your epsilon is probably too small or too large");else{r&&r.chainStart(t);for(var s={index:0,matches_head:!1,matches_pt1:!1},l={index:0,matches_head:!1,matches_pt1:!1},u=s,c=0;c
"),ne=re.length,ie=0;for(O=0;O=s[0]&&es[0]&&e<=s[1]};case"][":return function(t){var e=h(t);return e<=s[0]||e>=s[1]};case")(":return function(t){var e=h(t);return es[1]};case"](":return function(t){var e=h(t);return e<=s[0]||e>s[1]};case")[":return function(t){var e=h(t);return e=s[1]};case"{}":return function(t){return-1!==s.indexOf(h(t))};case"}{":return function(t){return-1===s.indexOf(h(t))}}}(r,a.getDataToCoordFunc(t,e,s,i),h),x={},b={},_=0;d?(g=function(t){x[t.astr]=n.extendDeep([],t.get()),t.set(new Array(f))},y=function(t,e){var r=x[t.astr][e];t.get()[e]=r}):(g=function(t){x[t.astr]=n.extendDeep([],t.get()),t.set([])},y=function(t,e){var r=x[t.astr][e];t.get().push(r)}),A(g);for(var w=o(e.transforms,r),T=0;T4*n&&(this.tooManyColors=!0),this.updatePalette(r),1===i.length?i[0]:i},b.prototype.updatePalette=function(t){if(!this.tooManyColors){var e=this.maxColors,r=this.paletteTexture,n=Math.ceil(.25*t.length/e);if(n>1)for(var i=.25*(t=t.slice()).length%e;i=0&&"xmlns"!==(r=t.slice(0,e))&&(t=t.slice(e+1)),Q.hasOwnProperty(r)?{space:Q[r],local:t}:t}},X.attr=function(t,e){if(arguments.length<2){if("string"==typeof t){var r=this.node();return(t=a.ns.qualify(t)).local?r.getAttributeNS(t.space,t.local):r.getAttribute(t)}for(e in t)this.each(tt(e,t[e]));return this}return this.each(tt(t,e))},X.classed=function(t,e){if(arguments.length<2){if("string"==typeof t){var r=this.node(),n=(t=nt(t)).length,i=-1;if(e=r.classList){for(;++i=1)return 1;var e=t*t,r=e*t;return 4*(t<.5?r:3*(t-e)+r-.75)}function Dr(t){return 1-Math.cos(t*Pt)}function zr(t){return Math.pow(2,10*(t-1))}function Rr(t){return 1-Math.sqrt(1-t*t)}function Fr(t){return t<1/2.75?7.5625*t*t:t<2/2.75?7.5625*(t-=1.5/2.75)*t+.75:t<2.5/2.75?7.5625*(t-=2.25/2.75)*t+.9375:7.5625*(t-=2.625/2.75)*t+.984375}function Br(t,e){return e-=t,function(r){return Math.round(t+e*r)}}function Nr(t){var e,r,n,i=[t.a,t.b],a=[t.c,t.d],o=Ur(i),s=jr(i,a),l=Ur(((e=a)[0]+=(n=-s)*(r=i)[0],e[1]+=n*r[1],e))||0;i[0]*a[1]=0?t.slice(0,r):t,i=r>=0?t.slice(r+1):"in";return n=Sr.get(n)||Mr,i=Er.get(i)||I,e=i(n.apply(null,o.call(arguments,1))),function(t){return t<=0?0:t>=1?1:e(t)}},a.interpolateHcl=function(t,e){t=a.hcl(t),e=a.hcl(e);var r=t.h,n=t.c,i=t.l,o=e.h-r,s=e.c-n,l=e.l-i;return isNaN(s)&&(s=0,n=isNaN(n)?e.c:n),isNaN(o)?(o=0,r=isNaN(r)?e.h:r):o>180?o-=360:o<-180&&(o+=360),function(t){return Wt(r+o*t,n+s*t,i+l*t)+""}},a.interpolateHsl=function(t,e){t=a.hsl(t),e=a.hsl(e);var r=t.h,n=t.s,i=t.l,o=e.h-r,s=e.s-n,l=e.l-i;return isNaN(s)&&(s=0,n=isNaN(n)?e.s:n),isNaN(o)?(o=0,r=isNaN(r)?e.h:r):o>180?o-=360:o<-180&&(o+=360),function(t){return qt(r+o*t,n+s*t,i+l*t)+""}},a.interpolateLab=function(t,e){t=a.lab(t),e=a.lab(e);var r=t.l,n=t.a,i=t.b,o=e.l-r,s=e.a-n,l=e.b-i;return function(t){return te(r+o*t,n+s*t,i+l*t)+""}},a.interpolateRound=Br,a.transform=function(t){var e=l.createElementNS(a.ns.prefix.svg,"g");return(a.transform=function(t){if(null!=t){e.setAttribute("transform",t);var r=e.transform.baseVal.consolidate()}return new Nr(r?r.matrix:Vr)})(t)},Nr.prototype.toString=function(){return"translate("+this.translate+")rotate("+this.rotate+")skewX("+this.skew+")scale("+this.scale+")"};var Vr={a:1,b:0,c:0,d:1,e:0,f:0};function Hr(t){return t.length?t.pop()+",":""}function qr(t,e){var r=[],n=[];return t=a.transform(t),e=a.transform(e),function(t,e,r,n){if(t[0]!==e[0]||t[1]!==e[1]){var i=r.push("translate(",null,",",null,")");n.push({i:i-4,x:br(t[0],e[0])},{i:i-2,x:br(t[1],e[1])})}else(e[0]||e[1])&&r.push("translate("+e+")")}(t.translate,e.translate,r,n),function(t,e,r,n){t!==e?(t-e>180?e+=360:e-t>180&&(t+=360),n.push({i:r.push(Hr(r)+"rotate(",null,")")-2,x:br(t,e)})):e&&r.push(Hr(r)+"rotate("+e+")")}(t.rotate,e.rotate,r,n),function(t,e,r,n){t!==e?n.push({i:r.push(Hr(r)+"skewX(",null,")")-2,x:br(t,e)}):e&&r.push(Hr(r)+"skewX("+e+")")}(t.skew,e.skew,r,n),function(t,e,r,n){if(t[0]!==e[0]||t[1]!==e[1]){var i=r.push(Hr(r)+"scale(",null,",",null,")");n.push({i:i-4,x:br(t[0],e[0])},{i:i-2,x:br(t[1],e[1])})}else 1===e[0]&&1===e[1]||r.push(Hr(r)+"scale("+e+")")}(t.scale,e.scale,r,n),t=e=null,function(t){for(var e,i=-1,a=n.length;++i0?r=e:(t.c=null,t.t=NaN,t=null,l.end({type:"end",alpha:r=0})):e>0&&(l.start({type:"start",alpha:r=e}),t=Te(s.tick)),s):r},s.start=function(){var t,e,r,a=y.length,l=m.length,c=u[0],d=u[1];for(t=0;t=0;)r.push(i[n])}function on(t,e){for(var r=[t],n=[];null!=(t=r.pop());)if(n.push(t),(a=t.children)&&(i=a.length))for(var i,a,o=-1;++o=0;)o.push(c=u[l]),c.parent=a,c.depth=a.depth+1;r&&(a.value=0),a.children=u}else r&&(a.value=+r.call(n,a,a.depth)||0),delete a.children;return on(i,function(e){var n,i;t&&(n=e.children)&&n.sort(t),r&&(i=e.parent)&&(i.value+=e.value)}),s}return n.sort=function(e){return arguments.length?(t=e,n):t},n.children=function(t){return arguments.length?(e=t,n):e},n.value=function(t){return arguments.length?(r=t,n):r},n.revalue=function(t){return r&&(an(t,function(t){t.children&&(t.value=0)}),on(t,function(t){var e;t.children||(t.value=+r.call(n,t,t.depth)||0),(e=t.parent)&&(e.value+=t.value)})),t},n},a.layout.partition=function(){var t=a.layout.hierarchy(),e=[1,1];function r(t,e,n,i){var a=t.children;if(t.x=e,t.y=t.depth*i,t.dx=n,t.dy=i,a&&(o=a.length)){var o,s,l,u=-1;for(n=t.value?n/t.value:0;++up.x&&(p=t),t.depth>d.depth&&(d=t)});var v=e(h,p)/2-h.x,g=r[0]/(p.x+e(p,h)/2+v),y=r[1]/(d.depth||1);an(c,function(t){t.x=(t.x+v)*g,t.y=t.depth*y})}return u}function o(t){var r=t.children,n=t.parent.children,i=t.i?n[t.i-1]:null;if(r.length){!function(t){for(var e,r=0,n=0,i=t.children,a=i.length;--a>=0;)(e=i[a]).z+=r,e.m+=r,r+=e.s+(n+=e.c)}(t);var a=(r[0].z+r[r.length-1].z)/2;i?(t.z=i.z+e(t._,i._),t.m=t.z-a):t.z=a}else i&&(t.z=i.z+e(t._,i._));t.parent.A=function(t,r,n){if(r){for(var i,a=t,o=t,s=r,l=a.parent.children[0],u=a.m,c=o.m,f=s.m,h=l.m;s=Rn(s),a=zn(a),s&&a;)l=zn(l),(o=Rn(o)).a=t,(i=s.z+f-a.z-u+e(s._,a._))>0&&(Fn(Bn(s,t,n),t,i),u+=i,c+=i),f+=s.m,u+=a.m,h+=l.m,c+=o.m;s&&!Rn(o)&&(o.t=s,o.m+=f-c),a&&!zn(l)&&(l.t=a,l.m+=u-h,n=t)}return n}(t,i,t.parent.A||n[0])}function s(t){t._.x=t.z+t.parent.m,t.m+=t.parent.m}function l(t){t.x*=r[0],t.y=t.depth*r[1]}return i.separation=function(t){return arguments.length?(e=t,i):e},i.size=function(t){return arguments.length?(n=null==(r=t)?l:null,i):n?null:r},i.nodeSize=function(t){return arguments.length?(n=null==(r=t)?null:l,i):n?r:null},nn(i,t)},a.layout.cluster=function(){var t=a.layout.hierarchy().sort(null).value(null),e=Dn,r=[1,1],n=!1;function i(i,o){var s,l=t.call(this,i,o),u=l[0],c=0;on(u,function(t){var r=t.children;r&&r.length?(t.x=function(t){return t.reduce(function(t,e){return t+e.x},0)/t.length}(r),t.y=function(t){return 1+a.max(t,function(t){return t.y})}(r)):(t.x=s?c+=e(t,s):0,t.y=0,s=t)});var f=Nn(u),h=jn(u),p=f.x-e(f,h)/2,d=h.x+e(h,f)/2;return on(u,n?function(t){t.x=(t.x-u.x)*r[0],t.y=(u.y-t.y)*r[1]}:function(t){t.x=(t.x-p)/(d-p)*r[0],t.y=(1-(u.y?t.y/u.y:1))*r[1]}),l}return i.separation=function(t){return arguments.length?(e=t,i):e},i.size=function(t){return arguments.length?(n=null==(r=t),i):n?null:r},i.nodeSize=function(t){return arguments.length?(n=null!=(r=t),i):n?r:null},nn(i,t)},a.layout.treemap=function(){var t,e=a.layout.hierarchy(),r=Math.round,n=[1,1],i=null,o=Un,s=!1,l="squarify",u=.5*(1+Math.sqrt(5));function c(t,e){for(var r,n,i=-1,a=t.length;++i0;)s.push(r=u[i-1]),s.area+=r.area,"squarify"!==l||(n=p(s,v))<=h?(u.pop(),h=n):(s.area-=s.pop().area,d(s,v,a,!1),v=Math.min(a.dx,a.dy),s.length=s.area=0,h=1/0);s.length&&(d(s,v,a,!0),s.length=s.area=0),e.forEach(f)}}function h(t){var e=t.children;if(e&&e.length){var r,n=o(t),i=e.slice(),a=[];for(c(i,n.dx*n.dy/t.value),a.area=0;r=i.pop();)a.push(r),a.area+=r.area,null!=r.z&&(d(a,r.z?n.dx:n.dy,n,!i.length),a.length=a.area=0);e.forEach(h)}}function p(t,e){for(var r,n=t.area,i=0,a=1/0,o=-1,s=t.length;++oi&&(i=r));return e*=e,(n*=n)?Math.max(e*i*u/n,n/(e*a*u)):1/0}function d(t,e,n,i){var a,o=-1,s=t.length,l=n.x,u=n.y,c=e?r(t.area/e):0;if(e==n.dx){for((i||c>n.dy)&&(c=n.dy);++on.dx)&&(c=n.dx);++o1);return t+e*r*Math.sqrt(-2*Math.log(i)/i)}},logNormal:function(){var t=a.random.normal.apply(a,arguments);return function(){return Math.exp(t())}},bates:function(t){var e=a.random.irwinHall(t);return function(){return e()/t}},irwinHall:function(t){return function(){for(var e=0,r=0;rl;c--);o=o.slice(u,c)}return o},o.copy=function(){return ei(t.copy(),e,r,n)},Kn(o,t)}a.scale.linear=function(){return Jn([0,1],[0,1],Ar,!1)},a.scale.log=function(){return ei(a.scale.linear().domain([0,1]),10,!0,[1,10])};var ri={floor:function(t){return-Math.ceil(-t)},ceil:function(t){return-Math.floor(-t)}};function ni(t,e,r){var n=ii(e),i=ii(1/e);function a(e){return t(n(e))}return a.invert=function(e){return i(t.invert(e))},a.domain=function(e){return arguments.length?(t.domain((r=e.map(Number)).map(n)),a):r},a.ticks=function(t){return ti(r,t)},a.tickFormat=function(t,e){return d3_scale_linearTickFormat(r,t,e)},a.nice=function(t){return a.domain($n(r,t))},a.exponent=function(o){return arguments.length?(n=ii(e=o),i=ii(1/e),t.domain(r.map(n)),a):e},a.copy=function(){return ni(t.copy(),e,r)},Kn(a,t)}function ii(t){return function(e){return e<0?-Math.pow(-e,t):Math.pow(e,t)}}function ai(t,e){var r,n,i;function o(i){return n[((r.get(i)||("range"===e.t?r.set(i,t.push(i)):NaN))-1)%n.length]}function s(e,r){return a.range(t.length).map(function(t){return e+r*t})}return o.domain=function(n){if(!arguments.length)return t;t=[],r=new A;for(var i,a=-1,s=n.length;++a0?r[n-1]:t[0],n=Ct)return l(u,p)+(s?l(s,1-p):"")+"Z";var d,v,g,y,m,x,b,_,w,T,A,k,M=0,S=0,E=[];if((y=(+o.apply(this,arguments)||0)/2)&&(g=n===vi?Math.sqrt(s*s+u*u):+n.apply(this,arguments),p||(S*=-1),u&&(S=zt(g/u*Math.sin(y))),s&&(M=zt(g/s*Math.sin(y)))),u){m=u*Math.cos(c+S),x=u*Math.sin(c+S),b=u*Math.cos(f-S),_=u*Math.sin(f-S);var L=Math.abs(f-c-2*S)<=Et?0:1;if(S&&_i(m,x,b,_)===p^L){var C=(c+f)/2;m=u*Math.cos(C),x=u*Math.sin(C),b=_=null}}else m=x=0;if(s){w=s*Math.cos(f-M),T=s*Math.sin(f-M),A=s*Math.cos(c+M),k=s*Math.sin(c+M);var P=Math.abs(c-f+2*M)<=Et?0:1;if(M&&_i(w,T,A,k)===1-p^P){var O=(c+f)/2;w=s*Math.cos(O),T=s*Math.sin(O),A=k=null}}else w=T=0;if(h>Mt&&(d=Math.min(Math.abs(u-s)/2,+r.apply(this,arguments)))>.001){v=s0?0:1}function wi(t,e,r,n,i){var a=t[0]-e[0],o=t[1]-e[1],s=(i?n:-n)/Math.sqrt(a*a+o*o),l=s*o,u=-s*a,c=t[0]+l,f=t[1]+u,h=e[0]+l,p=e[1]+u,d=(c+h)/2,v=(f+p)/2,g=h-c,y=p-f,m=g*g+y*y,x=r-n,b=c*p-h*f,_=(y<0?-1:1)*Math.sqrt(Math.max(0,x*x*m-b*b)),w=(b*y-g*_)/m,T=(-b*g-y*_)/m,A=(b*y+g*_)/m,k=(-b*g+y*_)/m,M=w-d,S=T-v,E=A-d,L=k-v;return M*M+S*S>E*E+L*L&&(w=A,T=k),[[w-l,T-u],[w*r/x,T*r/x]]}function Ti(){return!0}function Ai(t){var e=Se,r=Ee,n=Ti,i=Mi,a=i.key,o=.7;function s(a){var s,l=[],u=[],c=-1,f=a.length,h=ve(e),p=ve(r);function d(){l.push("M",i(t(u),o))}for(;++cl?r.y-l:0;return Math.sqrt(u*u+f*f)}for(var p=h(u);p;){if((u+=p+r)>f)return;p=h(u)}for(p=h(f);p;){if(u>(f-=p+r))return;p=h(f)}return{min:u,max:f,len:f-u,total:c,isClosed:0===u&&f===c&&Math.abs(n.x-i.x)<.1&&Math.abs(n.y-i.y)<.1}},e.findPointOnPath=function(t,e,r,n){for(var i,a,o,s=(n=n||{}).pathLength||t.getTotalLength(),l=n.tolerance||.001,u=n.iterationLimit||30,c=t.getPointAtLength(0)[r]>t.getPointAtLength(s)[r]?-1:1,f=0,h=0,p=s;f0?p=i:h=i,f++}return a}},17880:function(t,e,r){"use strict";var n=r(15181),i=r(86431),a=r(69562),o=r(25623),s=r(79444).N,l=r(76802),u=r(92444),c=r(46716);function f(t,e){function r(r,a){return n.coerce(t,e,i.link.colorscales,r,a)}r("label"),r("cmin"),r("cmax"),r("colorscale")}t.exports=function(t,e,r,h){function p(r,a){return n.coerce(t,e,i,r,a)}var d=n.extendDeep(h.hoverlabel,t.hoverlabel),v=t.node,g=u.newContainer(e,"node");function y(t,e){return n.coerce(v,g,i.node,t,e)}y("label"),y("groups"),y("x"),y("y"),y("pad"),y("thickness"),y("line.color"),y("line.width"),y("hoverinfo",t.hoverinfo),l(v,g,y,d),y("hovertemplate");var m=h.colorway;y("color",g.label.map(function(t,e){return a.addOpacity(function(t){return m[t%m.length]}(e),.8)})),y("customdata");var x=t.link||{},b=u.newContainer(e,"link");function _(t,e){return n.coerce(x,b,i.link,t,e)}_("label"),_("arrowlen"),_("source"),_("target"),_("value"),_("line.color"),_("line.width"),_("hoverinfo",t.hoverinfo),l(x,b,_,d),_("hovertemplate");var w,T=o(h.paper_bgcolor).getLuminance()<.333?"rgba(255, 255, 255, 0.6)":"rgba(0, 0, 0, 0.2)";_("color",n.repeat(T,b.value.length)),_("customdata"),c(x,b,{name:"colorscales",handleItemDefaults:f}),s(e,h,p),p("orientation"),p("valueformat"),p("valuesuffix"),g.x.length&&g.y.length&&(w="freeform"),p("arrangement",w),n.coerceFont(p,"textfont",n.extendFlat({},h.font)),e._length=null}},17888:function(t,e,r){"use strict";var n=r(52237),i=r(35331),a=Object.prototype.toString;t.exports=function(t){if(!n(t))return null;if(i(t)){var e=t.toString;if("function"!=typeof e)return null;if(e===a)return null}try{return""+t}catch(t){return null}}},17896:function(t){"use strict";t.exports={boxmode:{valType:"enumerated",values:["group","overlay"],dflt:"overlay",editType:"calc"},boxgap:{valType:"number",min:0,max:1,dflt:.3,editType:"calc"},boxgroupgap:{valType:"number",min:0,max:1,dflt:.3,editType:"calc"}}},17956:function(t,e,r){"use strict";var n=r(46474),i=r(92444);t.exports=function(t,e,r,a,o){a("a")||(a("da"),a("a0")),a("b")||(a("db"),a("b0")),function(t,e,r,a){["aaxis","baxis"].forEach(function(o){var s=o.charAt(0),l=t[o]||{},u=i.newContainer(e,o),c={noTicklabelstep:!0,tickfont:"x",id:s+"axis",letter:s,font:e.font,name:o,data:t[s],calendar:e.calendar,dfltColor:a,bgColor:r.paper_bgcolor,autotypenumbersDflt:r.autotypenumbers,fullLayout:r};n(l,u,c),u._categories=u._categories||[],t[o]||"-"===l.type||(t[o]={type:l.type})})}(t,e,r,o)}},17984:function(t){"use strict";t.exports={name:"rangeslider",containerClassName:"rangeslider-container",bgClassName:"rangeslider-bg",rangePlotClassName:"rangeslider-rangeplot",maskMinClassName:"rangeslider-mask-min",maskMaxClassName:"rangeslider-mask-max",slideBoxClassName:"rangeslider-slidebox",grabberMinClassName:"rangeslider-grabber-min",grabAreaMinClassName:"rangeslider-grabarea-min",handleMinClassName:"rangeslider-handle-min",grabberMaxClassName:"rangeslider-grabber-max",grabAreaMaxClassName:"rangeslider-grabarea-max",handleMaxClassName:"rangeslider-handle-max",maskMinOppAxisClassName:"rangeslider-mask-min-opp-axis",maskMaxOppAxisClassName:"rangeslider-mask-max-opp-axis",maskColor:"rgba(0,0,0,0.4)",maskOppAxisColor:"rgba(0,0,0,0.2)",slideBoxFill:"transparent",slideBoxCursor:"ew-resize",grabAreaFill:"transparent",grabAreaCursor:"col-resize",grabAreaWidth:10,handleWidth:4,handleRadius:1,handleStrokeWidth:1,extraPad:15}},18008:function(t,e,r){"use strict";t.exports={moduleType:"trace",name:"candlestick",basePlotModule:r(29435),categories:["cartesian","svg","showLegend","candlestick","boxLayout"],meta:{},attributes:r(33691),layoutAttributes:r(17896),supplyLayoutDefaults:r(80671).supplyLayoutDefaults,crossTraceCalc:r(23530).crossTraceCalc,supplyDefaults:r(43484),calc:r(17307),plot:r(68343).plot,layerName:"boxlayer",style:r(89743).style,hoverPoints:r(65409).hoverPoints,selectPoints:r(44483)}},18030:function(t,e,r){"use strict";var n=r(15181),i=r(24181),a=r(26761),o=r(22203),s=r(5651),l=r(53125);t.exports=function(t,e,r,u){function c(r,i){return n.coerce(t,e,a,r,i)}if(c("carpet"),t.a&&t.b){if(!i(t,e,c,u,"a","b"))return void(e.visible=!1);c("text"),"constraint"===c("contours.type")?o(t,e,c,u,r,{hasHover:!1}):(s(t,e,c,function(r){return n.coerce2(t,e,a,r)}),l(t,e,c,u,{hasHover:!1}))}else e._defaultColor=r,e._length=null}},18049:function(t){t.exports=function(t,e){var r=e[0],n=e[1],i=e[2],a=e[3],o=e[4],s=e[5],l=e[6],u=e[7],c=e[8],f=e[9],h=e[10],p=e[11],d=e[12],v=e[13],g=e[14],y=e[15],m=r*s-n*o,x=r*l-i*o,b=r*u-a*o,_=n*l-i*s,w=n*u-a*s,T=i*u-a*l,A=c*v-f*d,k=c*g-h*d,M=c*y-p*d,S=f*g-h*v,E=f*y-p*v,L=h*y-p*g,C=m*L-x*E+b*S+_*M-w*k+T*A;return C?(C=1/C,t[0]=(s*L-l*E+u*S)*C,t[1]=(i*E-n*L-a*S)*C,t[2]=(v*T-g*w+y*_)*C,t[3]=(h*w-f*T-p*_)*C,t[4]=(l*M-o*L-u*k)*C,t[5]=(r*L-i*M+a*k)*C,t[6]=(g*b-d*T-y*x)*C,t[7]=(c*T-h*b+p*x)*C,t[8]=(o*E-s*M+u*A)*C,t[9]=(n*M-r*E-a*A)*C,t[10]=(d*w-v*b+y*m)*C,t[11]=(f*b-c*w-p*m)*C,t[12]=(s*k-o*S-l*A)*C,t[13]=(r*S-n*k+i*A)*C,t[14]=(v*x-d*_-g*m)*C,t[15]=(c*_-f*x+h*m)*C,t):null}},18095:function(t,e,r){"use strict";var n=r(16534),i=r(69562),a=r(88191),o=r(15181),s=r(46982),l=r(70394).resizeText,u=r(74349),c=u.textfont,f=u.insidetextfont,h=u.outsidetextfont,p=r(54791);function d(t,e,r){a.pointStyle(t.selectAll("path"),e,r),v(t,e,r)}function v(t,e,r){t.selectAll("text").each(function(t){var i=n.select(this),s=o.ensureUniformFontSize(r,g(i,t,e,r));a.font(i,s)})}function g(t,e,r,n){var i=n._fullLayout.font,a=r.textfont;if(t.classed("bartext-inside")){var o=_(e,r);a=m(r,e.i,i,o)}else t.classed("bartext-outside")&&(a=x(r,e.i,i));return a}function y(t,e,r){return b(c,t.textfont,e,r)}function m(t,e,r,n){var a=y(t,e,r);return(void 0===t._input.textfont||void 0===t._input.textfont.color||Array.isArray(t.textfont.color)&&void 0===t.textfont.color[e])&&(a={color:i.contrast(n),family:a.family,size:a.size}),b(f,t.insidetextfont,e,a)}function x(t,e,r){var n=y(t,e,r);return b(h,t.outsidetextfont,e,n)}function b(t,e,r,n){e=e||{};var i=p.getValue(e.family,r),a=p.getValue(e.size,r),o=p.getValue(e.color,r);return{family:p.coerceString(t.family,i,n.family),size:p.coerceNumber(t.size,a,n.size),color:p.coerceColor(t.color,o,n.color)}}function _(t,e){return"waterfall"===e.type?e[t.dir].marker.color:t.mcc||t.mc||e.marker.color}t.exports={style:function(t){var e=n.select(t).selectAll("g.barlayer").selectAll("g.trace");l(t,e,"bar");var r=e.size(),i=t._fullLayout;e.style("opacity",function(t){return t[0].trace.opacity}).each(function(t){("stack"===i.barmode&&r>1||0===i.bargap&&0===i.bargroupgap&&!t[0].trace.marker.line.width)&&n.select(this).attr("shape-rendering","crispEdges")}),e.selectAll("g.points").each(function(e){d(n.select(this),e[0].trace,t)}),s.getComponentMethod("errorbars","style")(e)},styleTextPoints:v,styleOnSelect:function(t,e,r){var i=e[0].trace;i.selectedpoints?function(t,e,r){a.selectedPointStyle(t.selectAll("path"),e),function(t,e,r){t.each(function(t){var i,s=n.select(this);if(t.selected){i=o.ensureUniformFontSize(r,g(s,t,e,r));var l=e.selected.textfont&&e.selected.textfont.color;l&&(i.color=l),a.font(s,i)}else a.selectedTextStyle(s,e)})}(t.selectAll("text"),e,r)}(r,i,t):(d(r,i,t),s.getComponentMethod("errorbars","style")(r))},getInsideTextFont:m,getOutsideTextFont:x,getBarColor:_,resizeText:l}},18352:function(t,e,r){"use strict";var n=r(15181),i=r(41993),a=r(31164);t.exports=function(t,e){var r,o,s;function l(t){return n.coerce(o._input,o,a,t)}if("group"===e.scattermode)for(s=0;s