<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[194407] trunk/PerformanceTests</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/194407">194407</a></dd>
<dt>Author</dt> <dd>jonlee@apple.com</dd>
<dt>Date</dt> <dd>2015-12-23 17:31:47 -0800 (Wed, 23 Dec 2015)</dd>
</dl>

<h3>Log Message</h3>
<pre>Split benchmark into two different pages
https://bugs.webkit.org/show_bug.cgi?id=152458

Reviewed by Simon Fraser.

Address comments.

* Animometer/resources/debug-runner/benchmark-runner.js:
(BenchmarkRunner.prototype._runTestAndRecordResults): When the testing is complete the frame owning the
sampler goes away, and a later call to get the JSON data is no longer available. Process the data
right here, instead, and just reference it when displaying the results in ResultsDashboard.prototype._processData.
* Animometer/resources/extensions.js:
(Array.prototype.fill.Array.prototype.fill): Add a null check. Remove braces around single-line clause.
(Array.prototype.find.Array.prototype.find): Update the null check.
(ResultsDashboard.prototype._processData): Use the already-processed data.
* Animometer/resources/runner/animometer.css:
(.frame-container &gt; iframe): Remove calc().

Move Array functions to extensions.js since that is included by the harness.
Add ES6 Array polyfills.

* Animometer/resources/algorithm.js:
(Array.prototype.swap): Moved to extensions.js.
* Animometer/resources/extensions.js:
(Array.prototype.swap):
(Array.prototype.fill): Added.
(Array.prototype.find): Added.

Adjust styles for iPad.

* Animometer/resources/runner/animometer.css:
(@media screen and (min-device-width: 768px)): Apply to iPad as well.
(@media screen and (max-device-width: 1024px)): Update width for iPads.

Adjustment styles for iOS.

* Animometer/developer.html: Different divs contain the iframe, so use a class instead and
update the style rules.
* Animometer/index.html:
* Animometer/resources/debug-runner/animometer.css: Remove extraneous rules.
(@media screen and (min-device-width: 1800px)): Move this up.
* Animometer/resources/runner/animometer.css: Add rules to accomodate iOS.

Get rid of prefixed flex properties for now.

* Animometer/resources/debug-runner/animometer.css:
* Animometer/resources/runner/animometer.css:

Update the structure of the harness. Remove the JSON-per-test but keep
the JSON of the whole test run. Use the full page in order to display
the graph.

* Animometer/developer.html: Update several of the JS file includes to UTF-8. Remove header and footer. Test results screen includes score,
average, and worst 5% statistics.
* Animometer/index.html: Make structure similar to developer.html.
* Animometer/resources/debug-runner/animometer.css: Remove most of the
button rules since they are superfluous. Move the progress bar to the
top, fixed. Update the results page rules.
* Animometer/resources/debug-runner/animometer.js: Remove most of the
additions to sectionsManager since they are no longer needed.
(setSectionHeader): Updates header of the section.
(window.suitesManager._updateStartButtonState): Update selector.
(showResults): Add keypress event for selecting different data for
copy/paste. Update how the results are populated. Include full test
JSON in a textarea, rather than requiring a button press.
(showTestGraph):
* Animometer/resources/debug-runner/tests.js: Update structure of Headers. Define different kinds of headers. Headers can control their
title, and the text used as the cell contents, including class name.
* Animometer/resources/extensions.js:
(ResultsTable): Update to include a flattened version of the headers,
used while populating table contents. Remove unneeded helper functions
for creating the table. Rename &quot;show&quot; to &quot;add&quot;.
* Animometer/resources/runner/animometer.css: Update rules to
accommodate the new structure.
* Animometer/resources/runner/animometer.js:
(window.sectionsManager.setSectionScore): Helper function to set the
score and mean for a section.
(window.sectionsManager.populateTable): Helper function to set the table.
(window.benchmarkController.showResults): Refactor.
(window.benchmarkController.selectResults): Update selectors.
* Animometer/resources/runner/tests.js: Set Headers. Debug harness
extends it.

Update debug runner to have similar names to the basic runner. Include
that page's CSS and remove extraneous CSS rules.

Get rid of the statistics table #record.

* Animometer/developer.html: Rename #home to #intro. Rename .spacer to hr.
* Animometer/resources/debug-runner/animometer.css: Set to flexbox when selected.
* Animometer/resources/debug-runner/animometer.js: Remove recordTable.
(window.suitesManager._updateStartButtonState): Update selector to #intro.
(setupRunningSectionStyle): Deleted.

* Animometer/resources/runner/animometer.css:
(#test-container.selected): Change to flex-box only when visible.

Remove recordTable.
* Animometer/resources/debug-runner/benchmark-runner.js:
(BenchmarkRunner.prototype._runTestAndRecordResults):
* Animometer/resources/runner/tests.js:
* Animometer/tests/bouncing-particles/resources/bouncing-canvas-images.js:
* Animometer/tests/bouncing-particles/resources/bouncing-canvas-particles.js:
* Animometer/tests/bouncing-particles/resources/bouncing-canvas-shapes.js:
* Animometer/tests/bouncing-particles/resources/bouncing-css-images.js:
* Animometer/tests/bouncing-particles/resources/bouncing-css-shapes.js:
* Animometer/tests/bouncing-particles/resources/bouncing-particles.js:
* Animometer/tests/bouncing-particles/resources/bouncing-svg-images.js:
* Animometer/tests/bouncing-particles/resources/bouncing-svg-shapes.js:
* Animometer/tests/examples/resources/canvas-electrons.js:
* Animometer/tests/examples/resources/canvas-stars.js:
* Animometer/tests/misc/resources/compositing-transforms.js:
* Animometer/tests/resources/main.js:
* Animometer/tests/resources/stage.js:
(StageBenchmark): Remove _recordTable.
* Animometer/tests/simple/resources/simple-canvas-paths.js:
* Animometer/tests/simple/resources/simple-canvas.js:
* Animometer/tests/template/resources/template-canvas.js:
* Animometer/tests/template/resources/template-css.js:
* Animometer/tests/template/resources/template-svg.js:
* Animometer/tests/text/resources/layering-text.js:

* Animometer/resources/debug-runner/animometer.js:
(willStartFirstIteration): Fix selector, since results-table is used
in multiple places, so it cannot be an id.

Make it possible to select the scores, or the whole table data,
by cycling through different selections through key press of 's'.

* Animometer/resources/runner/animometer.js:
(window.benchmarkController.showResults): Attach a keypress handler
if it hasn't been added already.
(window.benchmarkController.selectResults):
* Animometer/resources/runner/tests.js: Cycle through different
ranges.

Fix a few fly-by errors.

* Animometer/resources/debug-runner/benchmark-runner.js:
(BenchmarkRunnerState.prototype.prepareCurrentTest): Update the frame relative path
since the files are now in the top directory instead of inside runner/.
(BenchmarkRunner.prototype._runTestAndRecordResults): Incorrect reference to function.
(BenchmarkRunner.prototype.step): Member variable is never used.

A little stylistic cleanup.

* Animometer/resources/debug-runner/benchmark-runner.js:
* Animometer/resources/extensions.js:
(window.DocumentExtension.createElement):
* Animometer/tests/resources/main.js:
(Benchmark.prototype.record):
* Animometer/tests/resources/stage.js:
(StageBenchmark.prototype.showResults): Reverse progress and message.
The message appears less frequently than the progress.
* Animometer/tests/simple/resources/simple-canvas.js:
(SimpleCanvasBenchmark): Remove unused options.

Add newer version of harness in a new page. Consolidate differences between the two
pages.

* Animometer/developer.html: Include runner/animometer.js. Rename the JS function
to run the benchmark to startBenchmark() instead of startTest(). Rename #running to
#test-container.
* Animometer/index.html: Added. Similarly calls startBenchmark() and has #test-container.
* Animometer/resources/debug-runner/animometer.css: Make the canvas 2:1 (1200px x 800px)
instead of 4:3.

Split out benchmarkRunnerClient and benchmarkController.

* Animometer/resources/debug-runner/animometer.js: Move needed functions out of
benchmarkRunnerClient, and leave the rest here to extend that object. Get rid of _resultsTable
and move populating the results table into benchmarkController. Rename _resultsDashboard
to results and make it accessible for other objects to use.
(willAddTestFrame): This is unnecessary. Remove.

(window.sectionsManager.showScore): Grab it from the results object instead of
benchmarkRunnerClient.
(window.sectionsManager.showSection): Deleted. Moved to runner/animometer.js.

(window.benchmarkController._runBenchmark): Deleted. Mostly moved into _startBenchmark.
(window.benchmarkController.startBenchmark): Refactor to call _startBenchmark.
(window.benchmarkController.showResults): Include most of benchmarkRunnerClient.didFinishLastIteration()
here.

* Animometer/resources/debug-runner/benchmark-runner.js:
(BenchmarkRunner.prototype._appendFrame): Remove unneeded call to willAddTestFrame.
* Animometer/resources/extensions.js:
(ResultsDashboard): Change the class to process the sampler data on-demand and hold onto that data
for later referencing.
(ResultsDashboard.prototype.toJSON): Deleted.
(ResultsDashboard.prototype._processData): Rename toJSON to _processData since it's not really
outputting JSON. Store the processed data into a member variable that can be referenced later.
(ResultsDashboard.prototype.get data): Process the data if it hasn't already.
(ResultsDashboard.prototype.get score): Process the data if it hasn't already, then return the
aggregate score.
(ResultsTable.prototype._showHeader): When outputting the results to a table, don't force the
need for an empty children array. This was to allow for a header row in the table that spanned
multiple columns. In the simpler harness, this is not needed.
(ResultsTable.prototype._showEmptyCells):
(ResultsTable.prototype._showTest): This hardcoded the columns. At least for the name and score,
which is the bare minimum needed for the simpler harness, key off of the header name provided.
* Animometer/resources/runner/animometer.css: Added. Use a similar 2:1 ratio. The score tables are
split into the data and the headers, and are also displayed RTL so that a later patch allows a
user to copy-paste the data easily.
* Animometer/resources/runner/animometer.js: Added. Use a simpler version of benchmarkRunnerClient.
The debug harness will extend these classes.
(window.benchmarkController._startBenchmark): Used by both harnesses.
(window.benchmarkController.startBenchmark): Set hard-coded options.
(window.benchmarkController.showResults): Includes most of benchmarkRunnerClient.didFinishLastIteration()
here.

Get rid of utilities.js. Move it all into extensions.js.

* Animometer/resources/extensions.js:
* Animometer/tests/resources/utilities.js: Removed.

* Animometer/tests/bouncing-particles/bouncing-canvas-images.html: Remove script link.
* Animometer/tests/bouncing-particles/bouncing-canvas-shapes.html: Ditto.
* Animometer/tests/bouncing-particles/bouncing-css-images.html: Ditto.
* Animometer/tests/bouncing-particles/bouncing-css-shapes.html: Ditto.
* Animometer/tests/bouncing-particles/bouncing-svg-images.html: Ditto.
* Animometer/tests/bouncing-particles/bouncing-svg-shapes.html: Ditto.
* Animometer/tests/examples/canvas-electrons.html: Ditto.
* Animometer/tests/examples/canvas-stars.html: Ditto.
* Animometer/tests/misc/compositing-transforms.html: Ditto.
* Animometer/tests/simple/simple-canvas-paths.html: Ditto.
* Animometer/tests/template/template-canvas.html: Ditto.
* Animometer/tests/template/template-css.html: Ditto.
* Animometer/tests/template/template-svg.html: Ditto.
* Animometer/tests/text/layering-text.html: Ditto.

Split tests.js into two. Add a new suite to runner/tests.js.

* Animometer/developer.html: Update the script order. Scripts from
debug-runner/ will always build on those from runner/, and have the
same name.
* Animometer/resources/debug-runner/tests.js: Move &quot;complex examples&quot;
suite into &quot;miscellaneous tests&quot;.
(Suite): Deleted.
(Suite.prototype.prepare): Deleted.
(Suite.prototype.run): Deleted.
(suiteFromName): Deleted.
* Animometer/resources/runner/tests.js: Added. Take definitions and
functions needed by the test harness. Leave the test suites behind.
(Suite): Moved from debug script.
(Suite.prototype.prepare): Ditto.
(Suite.prototype.run): Ditto.
(suiteFromName): Ditto.
(testFromName): Ditto.

Move benchmark resources out into resources/debug-runner, and update URLs.

* Animometer/developer.html: Renamed from PerformanceTests/Animometer/runner/animometer.html.
* Animometer/resources/debug-runner/animometer.css: Renamed from PerformanceTests/Animometer/runner/resources/animometer.css.
* Animometer/resources/debug-runner/animometer.js: Renamed from PerformanceTests/Animometer/runner/resources/animometer.js.
* Animometer/resources/debug-runner/benchmark-runner.js: Renamed from PerformanceTests/Animometer/runner/resources/benchmark-runner.js.
* Animometer/resources/debug-runner/d3.min.js: Renamed from PerformanceTests/Animometer/runner/resources/d3.min.js.
* Animometer/resources/debug-runner/graph.js: Renamed from PerformanceTests/Animometer/runner/resources/graph.js.
* Animometer/resources/debug-runner/tests.js: Renamed from PerformanceTests/Animometer/runner/resources/tests.js.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkPerformanceTestsAnimometerresourcesalgorithmjs">trunk/PerformanceTests/Animometer/resources/algorithm.js</a></li>
<li><a href="#trunkPerformanceTestsAnimometerresourcesextensionsjs">trunk/PerformanceTests/Animometer/resources/extensions.js</a></li>
<li><a href="#trunkPerformanceTestsAnimometertestsbouncingparticlesbouncingcanvasimageshtml">trunk/PerformanceTests/Animometer/tests/bouncing-particles/bouncing-canvas-images.html</a></li>
<li><a href="#trunkPerformanceTestsAnimometertestsbouncingparticlesbouncingcanvasshapeshtml">trunk/PerformanceTests/Animometer/tests/bouncing-particles/bouncing-canvas-shapes.html</a></li>
<li><a href="#trunkPerformanceTestsAnimometertestsbouncingparticlesbouncingcssimageshtml">trunk/PerformanceTests/Animometer/tests/bouncing-particles/bouncing-css-images.html</a></li>
<li><a href="#trunkPerformanceTestsAnimometertestsbouncingparticlesbouncingcssshapeshtml">trunk/PerformanceTests/Animometer/tests/bouncing-particles/bouncing-css-shapes.html</a></li>
<li><a href="#trunkPerformanceTestsAnimometertestsbouncingparticlesbouncingsvgimageshtml">trunk/PerformanceTests/Animometer/tests/bouncing-particles/bouncing-svg-images.html</a></li>
<li><a href="#trunkPerformanceTestsAnimometertestsbouncingparticlesbouncingsvgshapeshtml">trunk/PerformanceTests/Animometer/tests/bouncing-particles/bouncing-svg-shapes.html</a></li>
<li><a href="#trunkPerformanceTestsAnimometertestsbouncingparticlesresourcesbouncingcanvasimagesjs">trunk/PerformanceTests/Animometer/tests/bouncing-particles/resources/bouncing-canvas-images.js</a></li>
<li><a href="#trunkPerformanceTestsAnimometertestsbouncingparticlesresourcesbouncingcanvasparticlesjs">trunk/PerformanceTests/Animometer/tests/bouncing-particles/resources/bouncing-canvas-particles.js</a></li>
<li><a href="#trunkPerformanceTestsAnimometertestsbouncingparticlesresourcesbouncingcanvasshapesjs">trunk/PerformanceTests/Animometer/tests/bouncing-particles/resources/bouncing-canvas-shapes.js</a></li>
<li><a href="#trunkPerformanceTestsAnimometertestsbouncingparticlesresourcesbouncingcssimagesjs">trunk/PerformanceTests/Animometer/tests/bouncing-particles/resources/bouncing-css-images.js</a></li>
<li><a href="#trunkPerformanceTestsAnimometertestsbouncingparticlesresourcesbouncingcssshapesjs">trunk/PerformanceTests/Animometer/tests/bouncing-particles/resources/bouncing-css-shapes.js</a></li>
<li><a href="#trunkPerformanceTestsAnimometertestsbouncingparticlesresourcesbouncingparticlesjs">trunk/PerformanceTests/Animometer/tests/bouncing-particles/resources/bouncing-particles.js</a></li>
<li><a href="#trunkPerformanceTestsAnimometertestsbouncingparticlesresourcesbouncingsvgimagesjs">trunk/PerformanceTests/Animometer/tests/bouncing-particles/resources/bouncing-svg-images.js</a></li>
<li><a href="#trunkPerformanceTestsAnimometertestsbouncingparticlesresourcesbouncingsvgshapesjs">trunk/PerformanceTests/Animometer/tests/bouncing-particles/resources/bouncing-svg-shapes.js</a></li>
<li><a href="#trunkPerformanceTestsAnimometertestsexamplescanvaselectronshtml">trunk/PerformanceTests/Animometer/tests/examples/canvas-electrons.html</a></li>
<li><a href="#trunkPerformanceTestsAnimometertestsexamplescanvasstarshtml">trunk/PerformanceTests/Animometer/tests/examples/canvas-stars.html</a></li>
<li><a href="#trunkPerformanceTestsAnimometertestsexamplesresourcescanvaselectronsjs">trunk/PerformanceTests/Animometer/tests/examples/resources/canvas-electrons.js</a></li>
<li><a href="#trunkPerformanceTestsAnimometertestsexamplesresourcescanvasstarsjs">trunk/PerformanceTests/Animometer/tests/examples/resources/canvas-stars.js</a></li>
<li><a href="#trunkPerformanceTestsAnimometertestsmisccompositingtransformshtml">trunk/PerformanceTests/Animometer/tests/misc/compositing-transforms.html</a></li>
<li><a href="#trunkPerformanceTestsAnimometertestsmiscresourcescompositingtransformsjs">trunk/PerformanceTests/Animometer/tests/misc/resources/compositing-transforms.js</a></li>
<li><a href="#trunkPerformanceTestsAnimometertestsresourcesmainjs">trunk/PerformanceTests/Animometer/tests/resources/main.js</a></li>
<li><a href="#trunkPerformanceTestsAnimometertestsresourcesstagejs">trunk/PerformanceTests/Animometer/tests/resources/stage.js</a></li>
<li><a href="#trunkPerformanceTestsAnimometertestssimpleresourcessimplecanvaspathsjs">trunk/PerformanceTests/Animometer/tests/simple/resources/simple-canvas-paths.js</a></li>
<li><a href="#trunkPerformanceTestsAnimometertestssimpleresourcessimplecanvasjs">trunk/PerformanceTests/Animometer/tests/simple/resources/simple-canvas.js</a></li>
<li><a href="#trunkPerformanceTestsAnimometertestssimplesimplecanvaspathshtml">trunk/PerformanceTests/Animometer/tests/simple/simple-canvas-paths.html</a></li>
<li><a href="#trunkPerformanceTestsAnimometerteststemplateresourcestemplatecanvasjs">trunk/PerformanceTests/Animometer/tests/template/resources/template-canvas.js</a></li>
<li><a href="#trunkPerformanceTestsAnimometerteststemplateresourcestemplatecssjs">trunk/PerformanceTests/Animometer/tests/template/resources/template-css.js</a></li>
<li><a href="#trunkPerformanceTestsAnimometerteststemplateresourcestemplatesvgjs">trunk/PerformanceTests/Animometer/tests/template/resources/template-svg.js</a></li>
<li><a href="#trunkPerformanceTestsAnimometerteststemplatetemplatecanvashtml">trunk/PerformanceTests/Animometer/tests/template/template-canvas.html</a></li>
<li><a href="#trunkPerformanceTestsAnimometerteststemplatetemplatecsshtml">trunk/PerformanceTests/Animometer/tests/template/template-css.html</a></li>
<li><a href="#trunkPerformanceTestsAnimometerteststemplatetemplatesvghtml">trunk/PerformanceTests/Animometer/tests/template/template-svg.html</a></li>
<li><a href="#trunkPerformanceTestsAnimometerteststextlayeringtexthtml">trunk/PerformanceTests/Animometer/tests/text/layering-text.html</a></li>
<li><a href="#trunkPerformanceTestsAnimometerteststextresourceslayeringtextjs">trunk/PerformanceTests/Animometer/tests/text/resources/layering-text.js</a></li>
<li><a href="#trunkPerformanceTestsChangeLog">trunk/PerformanceTests/ChangeLog</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkPerformanceTestsAnimometerdeveloperhtml">trunk/PerformanceTests/Animometer/developer.html</a></li>
<li><a href="#trunkPerformanceTestsAnimometerindexhtml">trunk/PerformanceTests/Animometer/index.html</a></li>
<li>trunk/PerformanceTests/Animometer/resources/debug-runner/</li>
<li><a href="#trunkPerformanceTestsAnimometerresourcesdebugrunneranimometercss">trunk/PerformanceTests/Animometer/resources/debug-runner/animometer.css</a></li>
<li><a href="#trunkPerformanceTestsAnimometerresourcesdebugrunneranimometerjs">trunk/PerformanceTests/Animometer/resources/debug-runner/animometer.js</a></li>
<li><a href="#trunkPerformanceTestsAnimometerresourcesdebugrunnerbenchmarkrunnerjs">trunk/PerformanceTests/Animometer/resources/debug-runner/benchmark-runner.js</a></li>
<li><a href="#trunkPerformanceTestsAnimometerresourcesdebugrunnerd3minjs">trunk/PerformanceTests/Animometer/resources/debug-runner/d3.min.js</a></li>
<li><a href="#trunkPerformanceTestsAnimometerresourcesdebugrunnergraphjs">trunk/PerformanceTests/Animometer/resources/debug-runner/graph.js</a></li>
<li><a href="#trunkPerformanceTestsAnimometerresourcesdebugrunnertestsjs">trunk/PerformanceTests/Animometer/resources/debug-runner/tests.js</a></li>
<li>trunk/PerformanceTests/Animometer/resources/runner/</li>
<li><a href="#trunkPerformanceTestsAnimometerresourcesrunneranimometercss">trunk/PerformanceTests/Animometer/resources/runner/animometer.css</a></li>
<li><a href="#trunkPerformanceTestsAnimometerresourcesrunneranimometerjs">trunk/PerformanceTests/Animometer/resources/runner/animometer.js</a></li>
<li><a href="#trunkPerformanceTestsAnimometerresourcesrunnertestsjs">trunk/PerformanceTests/Animometer/resources/runner/tests.js</a></li>
</ul>

<h3>Removed Paths</h3>
<ul>
<li>trunk/PerformanceTests/Animometer/runner/</li>
<li><a href="#trunkPerformanceTestsAnimometertestsresourcesutilitiesjs">trunk/PerformanceTests/Animometer/tests/resources/utilities.js</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkPerformanceTestsAnimometerdeveloperhtml"></a>
<div class="addfile"><h4>Added: trunk/PerformanceTests/Animometer/developer.html (0 => 194407)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/PerformanceTests/Animometer/developer.html                                (rev 0)
+++ trunk/PerformanceTests/Animometer/developer.html        2015-12-24 01:31:47 UTC (rev 194407)
</span><span class="lines">@@ -0,0 +1,99 @@
</span><ins>+&lt;!DOCTYPE html&gt;
+&lt;html&gt;
+&lt;head&gt;
+    &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, user-scalable=no&quot;&gt;
+    &lt;link rel=&quot;stylesheet&quot; href=&quot;resources/runner/animometer.css&quot;&gt;
+    &lt;link rel=&quot;stylesheet&quot; href=&quot;resources/debug-runner/animometer.css&quot;&gt;
+    &lt;script src=&quot;resources/strings.js&quot;&gt;&lt;/script&gt;
+    &lt;script src=&quot;resources/sampler.js&quot;&gt;&lt;/script&gt;
+    &lt;script src=&quot;resources/extensions.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;
+
+    &lt;script src=&quot;resources/runner/tests.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;
+    &lt;script src=&quot;resources/debug-runner/tests.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;
+    &lt;script src=&quot;resources/runner/animometer.js&quot;&gt;&lt;/script&gt;
+    &lt;script src=&quot;resources/debug-runner/animometer.js&quot;&gt;&lt;/script&gt;
+
+    &lt;script src=&quot;resources/debug-runner/benchmark-runner.js&quot;&gt;&lt;/script&gt;
+    &lt;script src=&quot;resources/debug-runner/d3.min.js&quot;&gt;&lt;/script&gt;
+    &lt;script src=&quot;resources/debug-runner/graph.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+    &lt;main&gt;
+        &lt;hr&gt;
+        &lt;section id=&quot;intro&quot; class=&quot;selected&quot;&gt;
+            &lt;h1&gt;Animometer&lt;/h1&gt;
+            &lt;div&gt;
+                &lt;div id=&quot;suites&quot;&gt;
+                    &lt;h2&gt;Suites:&lt;/h2&gt;
+                    &lt;ul class=&quot;tree&quot;&gt;&lt;/ul&gt;
+                &lt;/div&gt;
+                &lt;div id=&quot;options&quot;&gt;
+                    &lt;h2&gt;Options:&lt;/h2&gt;
+                    &lt;form name=&quot;benchmark-options&quot;&gt;
+                    &lt;ul&gt;
+                    &lt;li&gt;
+                        &lt;label&gt;Test length: &lt;input type=&quot;number&quot; id=&quot;test-interval&quot; value=&quot;10&quot;&gt; seconds each&lt;/label&gt;
+                    &lt;/li&gt;
+                    &lt;li&gt;
+                        &lt;h3&gt;Display:&lt;/h3&gt;
+                        &lt;ul&gt;
+                            &lt;li&gt;&lt;label&gt;&lt;input name=&quot;display&quot; type=&quot;radio&quot; value=&quot;minimal&quot; checked&gt; Minimal&lt;/label&gt;&lt;/li&gt;
+                            &lt;li&gt;&lt;label&gt;&lt;input name=&quot;display&quot; type=&quot;radio&quot; value=&quot;progress-bar&quot; checked&gt; Progress bar&lt;/label&gt;&lt;/li&gt;
+                        &lt;/ul&gt;
+                    &lt;/li&gt;
+                    &lt;li&gt;
+                        &lt;h3&gt;Adjusting the test complexity:&lt;/h3&gt;
+                        &lt;ul&gt;
+                            &lt;li&gt;&lt;label&gt;&lt;input name=&quot;adjustment&quot; type=&quot;radio&quot; value=&quot;fixed&quot;&gt; Keep constant&lt;/label&gt;&lt;/li&gt;
+                            &lt;li&gt;&lt;label&gt;&lt;input name=&quot;adjustment&quot; type=&quot;radio&quot; value=&quot;fixed-after-warmup&quot;&gt; Keep constant after warmup to target FPS&lt;/label&gt;&lt;/li&gt;
+                            &lt;li&gt;&lt;label&gt;&lt;input name=&quot;adjustment&quot; type=&quot;radio&quot; value=&quot;adaptive&quot; checked&gt; Maintain target FPS&lt;/label&gt;&lt;/li&gt;
+                        &lt;/ul&gt;
+                    &lt;/li&gt;
+                    &lt;li&gt;
+                        &lt;label&gt;Target frame rate: &lt;input type=&quot;number&quot; id=&quot;frame-rate&quot; value=&quot;50&quot;&gt; FPS&lt;/label&gt;
+                    &lt;/li&gt;
+                    &lt;li&gt;
+                        &lt;label&gt;&lt;input type=&quot;checkbox&quot; id=&quot;estimated-frame-rate&quot; checked&gt; Filter frame rate calculation&lt;/label&gt;
+                    &lt;/li&gt;
+                    &lt;/ul&gt;
+                    &lt;/form&gt;
+                &lt;/div&gt;
+            &lt;/div&gt;
+            &lt;button onclick=&quot;benchmarkController.startBenchmark()&quot;&gt;Start Test&lt;/button&gt;
+        &lt;/section&gt;
+        &lt;section id=&quot;test-container&quot;&gt;
+            &lt;div id=&quot;running-test&quot; class=&quot;frame-container&quot;&gt;&lt;/div&gt;
+            &lt;div id=&quot;progress&quot;&gt;
+                &lt;div id=&quot;progress-completed&quot;&gt;&lt;/div&gt;
+            &lt;/div&gt;
+        &lt;/section&gt;
+        &lt;section id=&quot;results&quot;&gt;
+            &lt;h1&gt;Animometer score&lt;/h1&gt;
+            &lt;p class=&quot;score&quot;&gt;&lt;/p&gt;
+            &lt;div id=&quot;results-tables&quot;&gt;
+                &lt;div&gt;
+                    &lt;table id=&quot;results-score&quot;&gt;&lt;/table&gt;
+                    &lt;table id=&quot;results-data&quot;&gt;&lt;/table&gt;
+                &lt;/div&gt;
+                &lt;table id=&quot;results-header&quot;&gt;&lt;/table&gt;
+            &lt;/div&gt;
+            &lt;div id=&quot;results-json&quot;&gt;
+                JSON:
+                &lt;textarea rows=1 onclick=&quot;this.focus();this.select()&quot; readonly&gt;&lt;/textarea&gt;
+            &lt;/div&gt;
+            &lt;button onclick=&quot;benchmarkController.startBenchmark()&quot;&gt;Test Again&lt;/button&gt;
+            &lt;p&gt;'s': Select different data for copy/paste&lt;/p&gt;
+        &lt;/section&gt;
+        &lt;section id=&quot;test-graph&quot;&gt;
+            &lt;header&gt;
+                &lt;button onclick=&quot;benchmarkController.showResults()&quot;&gt;&amp;lt; Results&lt;/button&gt;
+                &lt;h1&gt;Graph:&lt;/h1&gt;
+            &lt;/header&gt;
+            &lt;p class=&quot;score&quot;&gt;&lt;/p&gt;
+            &lt;p class=&quot;mean&quot;&gt;&lt;/p&gt;
+            &lt;div id=&quot;test-graph-data&quot;&gt;&lt;/div&gt;
+        &lt;/section&gt;
+        &lt;hr&gt;
+    &lt;/main&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkPerformanceTestsAnimometerindexhtml"></a>
<div class="addfile"><h4>Added: trunk/PerformanceTests/Animometer/index.html (0 => 194407)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/PerformanceTests/Animometer/index.html                                (rev 0)
+++ trunk/PerformanceTests/Animometer/index.html        2015-12-24 01:31:47 UTC (rev 194407)
</span><span class="lines">@@ -0,0 +1,38 @@
</span><ins>+&lt;!DOCTYPE html&gt;
+&lt;html&gt;
+&lt;head&gt;
+    &lt;meta charset=&quot;utf-8&quot;&gt;
+    &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, user-scalable=no&quot;&gt;
+    &lt;link rel=&quot;stylesheet&quot; href=&quot;resources/runner/animometer.css&quot;&gt;
+    &lt;script src=&quot;resources/strings.js&quot;&gt;&lt;/script&gt;
+    &lt;script src=&quot;resources/sampler.js&quot;&gt;&lt;/script&gt;
+    &lt;script src=&quot;resources/extensions.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;
+
+    &lt;script src=&quot;resources/runner/tests.js&quot;&gt;&lt;/script&gt;
+    &lt;script src=&quot;resources/runner/animometer.js&quot;&gt;&lt;/script&gt;
+
+    &lt;script src=&quot;resources/debug-runner/benchmark-runner.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+    &lt;main&gt;
+        &lt;hr&gt;
+        &lt;section id=&quot;intro&quot; class=&quot;selected&quot;&gt;
+            &lt;h1&gt;Animometer&lt;/h1&gt;
+            &lt;p&gt;Animometer is a graphics benchmark that measures a browser’s capability to animate complex scenes at a target frame rate.&lt;/p&gt;
+            &lt;button onclick=&quot;benchmarkController.startBenchmark()&quot;&gt;Run benchmark&lt;/button&gt;
+        &lt;/section&gt;
+        &lt;section id=&quot;test-container&quot; class=&quot;frame-container&quot;&gt;
+        &lt;/section&gt;
+        &lt;section id=&quot;results&quot;&gt;
+            &lt;h1&gt;Animometer score&lt;/h1&gt;
+            &lt;p class=&quot;score&quot;&gt;&lt;/p&gt;
+            &lt;div id=&quot;results-tables&quot;&gt;
+                &lt;table id=&quot;results-score&quot;&gt;&lt;/table&gt;
+                &lt;table id=&quot;results-header&quot;&gt;&lt;/table&gt;
+            &lt;/div&gt;
+            &lt;button onclick=&quot;benchmarkController.startBenchmark()&quot;&gt;Test Again&lt;/button&gt;
+        &lt;/section&gt;
+        &lt;hr&gt;
+    &lt;/main&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkPerformanceTestsAnimometerresourcesalgorithmjs"></a>
<div class="modfile"><h4>Modified: trunk/PerformanceTests/Animometer/resources/algorithm.js (194406 => 194407)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/PerformanceTests/Animometer/resources/algorithm.js        2015-12-24 01:10:55 UTC (rev 194406)
+++ trunk/PerformanceTests/Animometer/resources/algorithm.js        2015-12-24 01:31:47 UTC (rev 194407)
</span><span class="lines">@@ -1,11 +1,3 @@
</span><del>-Array.prototype.swap = function(i, j)
-{
-    var t = this[i];
-    this[i] = this[j];
-    this[j] = t;
-    return this;
-}
-
</del><span class="cx"> function Heap(maxSize, compare)
</span><span class="cx"> {
</span><span class="cx">     this._maxSize = maxSize;
</span></span></pre></div>
<a id="trunkPerformanceTestsAnimometerresourcesdebugrunneranimometercss"></a>
<div class="addfile"><h4>Added: trunk/PerformanceTests/Animometer/resources/debug-runner/animometer.css (0 => 194407)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/PerformanceTests/Animometer/resources/debug-runner/animometer.css                                (rev 0)
+++ trunk/PerformanceTests/Animometer/resources/debug-runner/animometer.css        2015-12-24 01:31:47 UTC (rev 194407)
</span><span class="lines">@@ -0,0 +1,391 @@
</span><ins>+body {
+    background-color: rgb(96, 96, 96);
+    color: rgb(235, 235, 235);
+}
+
+h1 {
+    margin: 5vh 0;
+}
+
+button {
+    border: 2px solid rgb(235, 235, 235);
+    color: rgb(235, 235, 235);
+}
+
+button:disabled {
+    border-color: rgba(235, 235, 235, .5);
+    color: rgba(235, 235, 235, .5);
+}
+
+button:hover {
+    background-color: rgba(255, 255, 255, .1);
+    cursor: pointer;
+}
+
+button:active {
+    color: inherit;
+    background-color: rgba(255, 255, 255, .2);
+}
+
+@media screen and (min-device-width: 1800px) {
+    section {
+        width: 1600px;
+        height: 800px;
+    }
+}
+
+/* -------------------------------------------------------------------------- */
+/*                               Tree                                         */
+/* -------------------------------------------------------------------------- */
+
+.tree {
+    padding: 0;
+    list-style-type: none;
+}
+
+.tree .expand-button {
+    position: absolute;
+    clip: rect(0, 0, 0, 0);
+}
+
+.tree .expand-button ~ ul {
+    display: none;
+}
+
+.tree .expand-button:checked ~ ul {
+    display: block;
+}
+
+.tree ul {
+    list-style-type:none;
+}
+
+.tree li {
+    position: relative;
+    padding: 0 0 1em 1em;
+}
+
+.tree ul li {
+    list-style:none;
+    padding: 1em 0 0 0em;
+}
+
+.tree &gt; li:last-child {
+    padding-bottom: 0;
+}
+
+.tree-label {
+  position: relative;
+  display: inline-block;
+}
+
+label.tree-label {
+    cursor: pointer;
+}
+
+.tree &gt; li &gt; label.tree-label:before {
+    position: relative;
+    z-index: 1;
+    float: left;
+    margin: 0 0 0 -2em;
+    width: 1em;
+    height: 1em;
+    content: '\25BA';
+    text-align: center;
+    line-height: 2.5em;
+    font-size: .5em;
+}
+
+.tree &gt; li &gt; :checked ~ label.tree-label:before {
+    content: '\25BC';
+}
+
+@media screen and (max-device-width: 414px) {
+    .tree {
+        padding-left: 1em;
+    }
+    .tree &gt; li &gt; label.tree-label:before {
+        font-size: 1em;
+        margin-left: -1.75em;
+        line-height: 1em;
+    }
+}
+
+/* -------------------------------------------------------------------------- */
+/*                                 Intro Section                              */
+/* -------------------------------------------------------------------------- */
+
+#intro {
+    flex-direction: column;
+    justify-content: flex-start;
+    align-content: center;
+
+    min-height: 600px;
+    height: auto;
+}
+
+#intro h2 {
+    margin-top: 0;
+    font-size: 1.2em;
+}
+
+#intro &gt; div {
+    width: 100%;
+    margin: 2em 0;
+    flex-direction: row;
+    display: flex;
+    align-content: flex-start;
+}
+
+#suites {
+    padding-left: 15vw;
+    flex: 0 1 40%;
+}
+
+#options {
+    flex: 1 1 auto;
+}
+
+#intro input[type=&quot;number&quot;] {
+    width: 50px;
+}

+#suites input[type=&quot;number&quot;] {
+    display: none;
+    float: right;
+}
+
+#suites input[type=&quot;number&quot;].selected {
+    display: inline;
+    margin: 0;
+}
+
+#suites ul ul {
+    font-size: .8em;
+    margin: 0;
+    padding: 0 0 0 1em;
+}
+
+#options ul {
+    margin: 0;
+    padding: 0;
+    list-style: none;
+}
+
+#options h3 {
+    font-size: 1em;
+    font-weight: inherit;
+    margin: 0 0 .3em 0;
+    padding: 0;
+}
+
+#options &gt; form &gt; ul &gt; li {
+    padding: 0 0 1em 0;
+}
+
+#options ul ul {
+    padding: 0;
+}
+
+#options li {
+    padding: .1em 0;
+}
+
+@media screen and (min-device-width: 1800px) {
+    #intro {
+        min-height: 800px;
+    }
+}
+
+@media screen and (max-device-width: 414px) {
+    #intro {
+        min-height: 100%;
+    }
+
+    #intro &gt; div {
+        flex-direction: column;
+    }
+
+    #suites,
+    #options {
+        padding: 0 5px;
+        margin: 0;
+        flex: 0 0 auto;
+    }
+}
+
+/* -------------------------------------------------------------------------- */
+/*                           Running Section                                  */
+/* -------------------------------------------------------------------------- */
+
+#test-container {
+    position: relative;
+}
+
+#running-test {
+    display: flex;
+    align-items: center;
+    justify-content: center;
+}
+
+#progress {
+    display: none;
+}
+
+.display-progress-bar #progress {
+    display: block;
+    position: fixed;
+    top: 0;
+    left: 0;
+    height: 6px;
+    width: 100%;
+    background-color: rgb(128, 128, 128);
+}
+
+.display-progress-bar #progress-completed {
+    position: absolute;
+    top: 0;
+    left: 0;
+    height: 6px;
+    width: 0;
+    background-color: rgb(235, 96, 32);
+}
+
+@media screen and (min-device-width: 1800px) {
+    .frame-container &gt; iframe {
+        width: 1600px;
+        height: 800px;
+    }
+}
+
+/* -------------------------------------------------------------------------- */
+/*                           Results Section                                  */
+/* -------------------------------------------------------------------------- */
+
+#results h1, #test-graph h1 {
+    font-size: 2em;
+}
+
+.score {
+    font-size: 3em;
+}
+
+.mean {
+    margin-top: 0;
+    margin-bottom: 1em;
+    font-size: 1.5em;
+    font-weight: 400;
+}
+
+#results-data .average {
+    padding-left: 1em;
+    text-align: right;
+}
+
+#results-data .stdev {
+    text-align: left;
+    padding-left: .25em;
+}
+
+#results-data button.small-button {
+    border: 1px solid rgba(235, 235, 235, .9);
+    color: rgba(235, 235, 235, .9);
+    border-radius: 2px;
+    padding: 1px 4px;
+    margin: 0 0 0 1em;
+    font-size: 9px;
+}
+
+#results-data button.small-button:active {
+    background-color: rgba(235, 235, 235, .2);
+    color: inherit;
+}
+
+#results-tables td.noisy-results {
+    color: rgb(255, 104, 104);
+}
+
+#results-tables div {
+    direction: ltr;
+    display: flex;
+    flex-direction: row;
+}
+
+#results-json {
+    margin-bottom: 3em;
+}
+
+#results-json textarea {
+    vertical-align: sub;
+}
+
+#test-graph {
+    flex: 1 0 calc(100% - 40px);
+}
+
+#test-graph h1 {
+    margin-bottom: 0;
+}
+
+#test-graph header {
+    position: relative;
+    width: 100%;
+}
+
+#test-graph header button {
+    position: absolute;
+    top: 1.5em;
+    left: 0;
+    border-width: 1px;
+    font-size: 1em;
+    padding: .5em 1em;
+}
+
+#test-graph-data {
+    flex: 1 1 auto;
+    align-self: stretch;
+}
+
+/* -------------------------------------------------------------------------- */
+/*                           Graph Section                                    */
+/* -------------------------------------------------------------------------- */
+
+#test-graph-data {
+    font: 10px sans-serif;
+    color: rgb(235, 235, 235);
+}
+
+#test-graph-data &gt; svg {
+    fill: none;
+}
+
+.axis path,
+.axis line {
+    fill: none;
+    stroke: #999999;
+    shape-rendering: crispEdges;
+}
+
+.left-samples {
+    stroke: #7ADD49;
+    stroke-width: 1.5px;
+}
+
+.right-samples {
+    stroke: #FA4925;
+    stroke-width: 1.5px;
+}
+
+.sample-time {
+    stroke: #5493D6;
+}
+
+.left-mean {
+    stroke: #7ADD49;
+    opacity: .8;
+}
+
+.right-mean {
+    stroke: #FA4925;
+    opacity: .8;
+}
</ins></span></pre></div>
<a id="trunkPerformanceTestsAnimometerresourcesdebugrunneranimometerjsfromrev194406trunkPerformanceTestsAnimometerrunnerresourcesanimometerjs"></a>
<div class="copfile"><h4>Copied: trunk/PerformanceTests/Animometer/resources/debug-runner/animometer.js (from rev 194406, trunk/PerformanceTests/Animometer/runner/resources/animometer.js) (0 => 194407)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/PerformanceTests/Animometer/resources/debug-runner/animometer.js                                (rev 0)
+++ trunk/PerformanceTests/Animometer/resources/debug-runner/animometer.js        2015-12-24 01:31:47 UTC (rev 194407)
</span><span class="lines">@@ -0,0 +1,362 @@
</span><ins>+Utilities.extendObject(window.benchmarkRunnerClient, {
+    testsCount: null,
+    progressBar: null,
+
+    didRunTest: function ()
+    {
+        this.progressBar.incRange();
+    },
+    
+    willStartFirstIteration: function ()
+    {
+        this.results = new ResultsDashboard();
+        this.progressBar = new ProgressBar(document.getElementById(&quot;progress-completed&quot;), this.testsCount);
+    }
+});
+
+Utilities.extendObject(window.sectionsManager, {
+    setSectionHeader: function(sectionIdentifier, title)
+    {
+        document.querySelector(&quot;#&quot; + sectionIdentifier + &quot; h1&quot;).textContent = title;
+    }
+});
+
+window.optionsManager =
+{
+    valueForOption: function(name)
+    {
+        var formElement = document.forms[&quot;benchmark-options&quot;].elements[name];
+        if (formElement.type == &quot;checkbox&quot;)
+            return formElement.checked;
+        return formElement.value;
+    },
+    
+    updateUIFromLocalStorage: function()
+    {
+        var formElements = document.forms[&quot;benchmark-options&quot;].elements;
+
+        for (var i = 0; i &lt; formElements.length; ++i) {
+            var formElement = formElements[i];
+            var name = formElement.id || formElement.name;
+            var type = formElement.type;
+
+            var value = localStorage.getItem(name);
+            if (value === null)
+                continue;
+
+            if (type == &quot;number&quot;)
+                formElements[name].value = +value;
+            else if (type == &quot;checkbox&quot;)
+                formElements[name].checked = value == &quot;true&quot;;
+            else if (type == &quot;radio&quot;)
+                formElements[name].value = value;
+        }
+    },
+
+    updateLocalStorageFromUI: function()
+    {
+        var formElements = document.forms[&quot;benchmark-options&quot;].elements;
+        var options = {};        
+
+        for (var i = 0; i &lt; formElements.length; ++i) {
+            var formElement = formElements[i];
+            var name = formElement.id || formElement.name;
+            var type = formElement.type;
+
+            if (type == &quot;number&quot;)
+                options[name] = formElement.value;
+            else if (type == &quot;checkbox&quot;)
+                options[name] = formElement.checked;
+            else if (type == &quot;radio&quot;)
+                options[name] = formElements[name].value;
+    
+            localStorage.setItem(name, options[name]);
+        }
+        
+        return options;
+    }
+}
+
+window.suitesManager =
+{
+    _treeElement: function()
+    {
+        return document.querySelector(&quot;#suites &gt; .tree&quot;);
+    },
+    
+    _suitesElements: function()
+    {
+        return document.querySelectorAll(&quot;#suites &gt; ul &gt; li&quot;);
+    },
+    
+    _checkboxElement: function(element)
+    {
+        return element.querySelector(&quot;input[type='checkbox']:not(.expand-button)&quot;);
+    },
+
+    _editElement: function(element)
+    {
+        return element.querySelector(&quot;input[type='number']&quot;);
+    },
+
+    _editsElements: function()
+    {
+        return document.querySelectorAll(&quot;#suites input[type='number']&quot;);
+    },
+        
+    _localStorageNameForTest: function(suiteName, testName)
+    {
+        return suiteName + &quot;/&quot; + testName;
+    },
+
+    _updateSuiteCheckboxState: function(suiteCheckbox)
+    {
+        var numberEnabledTests = 0;
+        suiteCheckbox.testsElements.forEach(function(testElement) {
+            var testCheckbox = this._checkboxElement(testElement);
+            if (testCheckbox.checked)
+                ++numberEnabledTests;
+        }, this);
+        suiteCheckbox.checked = numberEnabledTests &gt; 0;
+        suiteCheckbox.indeterminate = numberEnabledTests &gt; 0 &amp;&amp; numberEnabledTests &lt; suiteCheckbox.testsElements.length;
+    },
+
+    _updateStartButtonState: function()
+    {
+        var suitesElements = this._suitesElements();
+        var startButton = document.querySelector(&quot;#intro button&quot;);
+        
+        for (var i = 0; i &lt; suitesElements.length; ++i) {
+            var suiteElement = suitesElements[i];
+            var suiteCheckbox = this._checkboxElement(suiteElement);
+            
+            if (suiteCheckbox.checked) {
+                startButton.disabled = false;
+                return;
+            }
+        }
+    
+        startButton.disabled = true;
+    },
+
+    _onChangeSuiteCheckbox: function(event)
+    {
+        var selected = event.target.checked;
+        event.target.testsElements.forEach(function(testElement) {
+            var testCheckbox = this._checkboxElement(testElement);
+            testCheckbox.checked = selected;        
+        }, this);
+        this._updateStartButtonState();
+    },
+
+    _onChangeTestCheckbox: function(event)
+    {
+        var suiteCheckbox = event.target.suiteCheckbox;
+        this._updateSuiteCheckboxState(suiteCheckbox);
+        this._updateStartButtonState();
+    },
+
+    _createSuiteElement: function(treeElement, suite, id)
+    {
+        var suiteElement = DocumentExtension.createElement(&quot;li&quot;, {}, treeElement);
+        var expand = DocumentExtension.createElement(&quot;input&quot;, { type: &quot;checkbox&quot;,  class: &quot;expand-button&quot;, id: id }, suiteElement);
+        var label = DocumentExtension.createElement(&quot;label&quot;, { class: &quot;tree-label&quot;, for: id }, suiteElement);
+
+        var suiteCheckbox = DocumentExtension.createElement(&quot;input&quot;, { type: &quot;checkbox&quot; }, label);
+        suiteCheckbox.suite = suite;
+        suiteCheckbox.onchange = this._onChangeSuiteCheckbox.bind(this);
+        suiteCheckbox.testsElements = [];
+
+        label.appendChild(document.createTextNode(&quot; &quot; + suite.name));
+        return suiteElement;
+    },
+
+    _createTestElement: function(listElement, test, suiteCheckbox)
+    {
+        var testElement = DocumentExtension.createElement(&quot;li&quot;, {}, listElement);
+        var span = DocumentExtension.createElement(&quot;label&quot;, { class: &quot;tree-label&quot; }, testElement);
+
+        var testCheckbox = DocumentExtension.createElement(&quot;input&quot;, { type: &quot;checkbox&quot; }, span);
+        testCheckbox.test = test;
+        testCheckbox.onchange = this._onChangeTestCheckbox.bind(this);
+        testCheckbox.suiteCheckbox = suiteCheckbox;
+
+        suiteCheckbox.testsElements.push(testElement);
+        span.appendChild(document.createTextNode(&quot; &quot; + test.name));
+        DocumentExtension.createElement(&quot;input&quot;, { type: &quot;number&quot; }, testElement);
+        return testElement;
+    },
+
+    createElements: function()
+    {
+        var treeElement = this._treeElement();
+
+        Suites.forEach(function(suite, index) {
+            var suiteElement = this._createSuiteElement(treeElement, suite, &quot;suite-&quot; + index);
+            var listElement = DocumentExtension.createElement(&quot;ul&quot;, {}, suiteElement);
+            var suiteCheckbox = this._checkboxElement(suiteElement);
+
+            suite.tests.forEach(function(test) {
+                var testElement = this._createTestElement(listElement, test, suiteCheckbox);
+            }, this);
+        }, this);
+    },
+    
+    updateEditsElementsState: function()
+    {
+        var editsElements = this._editsElements();
+        var showComplexityInputs = optionsManager.valueForOption(&quot;adjustment&quot;) == &quot;fixed&quot;;
+
+        for (var i = 0; i &lt; editsElements.length; ++i) {
+            var editElement = editsElements[i];
+            if (showComplexityInputs)
+                editElement.classList.add(&quot;selected&quot;);
+            else
+                editElement.classList.remove(&quot;selected&quot;);
+        }
+    },
+
+    updateDisplay: function()
+    {
+        document.body.className = &quot;display-&quot; + optionsManager.valueForOption(&quot;display&quot;);
+    },
+
+    updateUIFromLocalStorage: function()
+    {
+        var suitesElements = this._suitesElements();
+        
+        for (var i = 0; i &lt; suitesElements.length; ++i) {
+            var suiteElement = suitesElements[i];
+            var suiteCheckbox = this._checkboxElement(suiteElement);
+            var suite = suiteCheckbox.suite;
+            
+            suiteCheckbox.testsElements.forEach(function(testElement) {
+                var testCheckbox = this._checkboxElement(testElement);
+                var testEdit = this._editElement(testElement);
+                var test = testCheckbox.test;
+                
+                var str = localStorage.getItem(this._localStorageNameForTest(suite.name, test.name));
+                if (str === null)
+                    return;
+
+                var value = JSON.parse(str);
+                testCheckbox.checked = value.checked;
+                testEdit.value = value.complexity;
+            }, this);
+
+            this._updateSuiteCheckboxState(suiteCheckbox);
+        }
+        
+        this._updateStartButtonState();
+    },
+
+    updateLocalStorageFromUI: function()
+    {
+        var suitesElements = this._suitesElements();
+        var suites = [];
+        
+        for (var i = 0; i &lt; suitesElements.length; ++i) {
+            var suiteElement = suitesElements[i];
+            var suiteCheckbox = this._checkboxElement(suiteElement);
+            var suite = suiteCheckbox.suite;
+
+            var tests = [];
+            suiteCheckbox.testsElements.forEach(function(testElement) {
+                var testCheckbox = this._checkboxElement(testElement);
+                var testEdit = this._editElement(testElement);
+                var test = testCheckbox.test;
+                
+                if (testCheckbox.checked) {
+                    test.complexity = testEdit.value;
+                    tests.push(test);
+                }
+
+                var value = { checked: testCheckbox.checked, complexity: testEdit.value }; 
+                localStorage.setItem(this._localStorageNameForTest(suite.name, test.name), JSON.stringify(value));
+            }, this);
+
+            if (tests.length)
+                suites.push(new Suite(suiteCheckbox.suite.name, tests));
+        }
+
+        return suites;
+    },
+    
+    updateLocalStorageFromJSON: function(iterationResults)
+    {
+        for (var suiteName in iterationResults[Strings.json.results.suites]) {
+            var suiteResults = iterationResults[Strings.json.results.suites][suiteName];
+
+            for (var testName in suiteResults[Strings.json.results.tests]) {
+                var testResults = suiteResults[Strings.json.results.tests][testName];
+                var data = testResults[Strings.json.experiments.complexity];
+                var complexity = Math.round(data[Strings.json.measurements.average]);
+
+                var value = { checked: true, complexity: complexity };
+                localStorage.setItem(this._localStorageNameForTest(suiteName, testName), JSON.stringify(value));
+            }
+        }
+    }
+}
+
+Utilities.extendObject(window.benchmarkController, {
+    initialize: function()
+    {
+        document.forms[&quot;benchmark-options&quot;].addEventListener(&quot;change&quot;, benchmarkController.onFormChanged, true);
+        optionsManager.updateUIFromLocalStorage();
+        suitesManager.createElements();
+        suitesManager.updateUIFromLocalStorage();
+        suitesManager.updateDisplay();
+        suitesManager.updateEditsElementsState();
+    },
+
+    onFormChanged: function(event)
+    {
+        if (event.target.name == &quot;adjustment&quot;) {
+            suitesManager.updateEditsElementsState();
+            return;
+        }
+        if (event.target.name == &quot;display&quot;) {
+            suitesManager.updateDisplay();
+        }
+    },
+
+    startBenchmark: function()
+    {
+        var options = optionsManager.updateLocalStorageFromUI();
+        var suites = suitesManager.updateLocalStorageFromUI();
+        this._startBenchmark(suites, options, &quot;running-test&quot;);
+    },
+
+    showResults: function()
+    {
+        if (!this.addedKeyEvent) {
+            document.addEventListener(&quot;keypress&quot;, this.selectResults, false);
+            this.addedKeyEvent = true;
+        }
+
+        sectionsManager.setSectionScore(&quot;results&quot;, benchmarkRunnerClient.results.score.toFixed(2));
+        var data = benchmarkRunnerClient.results.data[Strings.json.results.iterations];
+        sectionsManager.populateTable(&quot;results-header&quot;, Headers.testName, data);
+        sectionsManager.populateTable(&quot;results-score&quot;, Headers.score, data);
+        sectionsManager.populateTable(&quot;results-data&quot;, Headers.details, data);
+        document.querySelector(&quot;#results-json textarea&quot;).textContent = JSON.stringify(benchmarkRunnerClient.results.data, function(key, value) {
+            if (typeof value == &quot;number&quot;)
+                return value.toFixed(2);
+            return value;
+        });
+        sectionsManager.showSection(&quot;results&quot;, true);
+
+        suitesManager.updateLocalStorageFromJSON(data[0]);
+    },
+
+    showTestGraph: function(testName, score, mean, axes, samples, samplingTimeOffset)
+    {
+        sectionsManager.setSectionHeader(&quot;test-graph&quot;, testName);
+        sectionsManager.setSectionScore(&quot;test-graph&quot;, score, mean);
+        sectionsManager.showSection(&quot;test-graph&quot;, true);
+        graph(&quot;#test-graph-data&quot;, new Insets(10, 20, 30, 40), axes, samples, samplingTimeOffset);
+    }
+});
+
+window.addEventListener(&quot;load&quot;, benchmarkController.initialize);
</ins></span></pre></div>
<a id="trunkPerformanceTestsAnimometerresourcesdebugrunnerbenchmarkrunnerjsfromrev194406trunkPerformanceTestsAnimometerrunnerresourcesbenchmarkrunnerjs"></a>
<div class="copfile"><h4>Copied: trunk/PerformanceTests/Animometer/resources/debug-runner/benchmark-runner.js (from rev 194406, trunk/PerformanceTests/Animometer/runner/resources/benchmark-runner.js) (0 => 194407)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/PerformanceTests/Animometer/resources/debug-runner/benchmark-runner.js                                (rev 0)
+++ trunk/PerformanceTests/Animometer/resources/debug-runner/benchmark-runner.js        2015-12-24 01:31:47 UTC (rev 194407)
</span><span class="lines">@@ -0,0 +1,184 @@
</span><ins>+function BenchmarkRunnerState(suites)
+{
+    this._suites = suites;
+    this._suiteIndex = -1;
+    this._testIndex = 0;
+    this.next();
+}
+
+BenchmarkRunnerState.prototype.currentSuite = function()
+{
+    return this._suites[this._suiteIndex];
+};
+
+BenchmarkRunnerState.prototype.currentTest = function()
+{
+    var suite = this.currentSuite();
+    return suite ? suite.tests[this._testIndex] : null;
+};
+
+BenchmarkRunnerState.prototype.isFirstTest = function()
+{
+    return !this._testIndex;
+};
+
+BenchmarkRunnerState.prototype.next = function()
+{
+    this._testIndex++;
+
+    var suite = this._suites[this._suiteIndex];
+    if (suite &amp;&amp; this._testIndex &lt; suite.tests.length)
+        return this;
+
+    this._testIndex = 0;
+    do {
+        this._suiteIndex++;
+    } while (this._suiteIndex &lt; this._suites.length &amp;&amp; this._suites[this._suiteIndex].disabled);
+
+    return this;
+};
+
+BenchmarkRunnerState.prototype.prepareCurrentTest = function(runner, frame)
+{
+    var suite = this.currentSuite();
+    var test = this.currentTest();
+    var promise = new SimplePromise;
+    frame.onload = function() {
+        suite.prepare(runner, frame.contentWindow, frame.contentDocument).then(function(result) { promise.resolve(result); });
+    }
+    frame.src = &quot;tests/&quot; + test.url;
+    return promise;
+};
+
+function BenchmarkRunner(suites, frameContainer, client)
+{
+    this._suites = suites;
+    this._client = client;
+    this._frameContainer = frameContainer;
+}
+
+BenchmarkRunner.prototype.waitForElement = function(selector)
+{
+    var promise = new SimplePromise;
+    var contentDocument = this._frame.contentDocument;
+
+    function resolveIfReady() {
+        var element = contentDocument.querySelector(selector);
+        if (element)
+            return promise.resolve(element);
+        setTimeout(resolveIfReady, 50);
+    }
+
+    resolveIfReady();
+    return promise;
+};
+
+BenchmarkRunner.prototype._appendFrame = function()
+{
+    var frame = document.createElement(&quot;iframe&quot;);
+    frame.setAttribute(&quot;scrolling&quot;, &quot;no&quot;);
+
+    this._frameContainer.insertBefore(frame, this._frameContainer.firstChild);
+    this._frame = frame;
+    return frame;
+};
+
+BenchmarkRunner.prototype._removeFrame = function()
+{
+    if (this._frame) {
+        this._frame.parentNode.removeChild(this._frame);
+        this._frame = null;
+    }
+};
+
+BenchmarkRunner.prototype._runTestAndRecordResults = function(state)
+{
+    var promise = new SimplePromise;
+    var suite = state.currentSuite();
+    var test = state.currentTest();
+    
+    if (this._client &amp;&amp; this._client.willRunTest)
+        this._client.willRunTest(suite, test);
+
+    var contentWindow = this._frame.contentWindow;
+    var self = this;
+
+    suite.run(contentWindow, test, this._client.options, this._client.progressBar).then(function(sampler) {
+        var samplers = self._suitesSamplers[suite.name] || {};
+        samplers[test.name] = sampler.toJSON(true, true);
+        self._suitesSamplers[suite.name] = samplers;
+
+        if (self._client &amp;&amp; self._client.didRunTest)
+            self._client.didRunTest(suite, test);
+        
+        state.next();
+        if (state.currentSuite() != suite)
+            self._removeFrame();
+        promise.resolve(state);
+    });
+    
+    return promise;
+};
+
+BenchmarkRunner.prototype.step = function(state)
+{
+    if (!state) {
+        state = new BenchmarkRunnerState(this._suites);
+        this._suitesSamplers = {};
+    }
+
+    var suite = state.currentSuite();
+    if (!suite) {
+        this._finalize();
+        var promise = new SimplePromise;
+        promise.resolve();
+        return promise;
+    }
+
+    if (state.isFirstTest()) {
+        this._appendFrame();
+    }
+
+    return state.prepareCurrentTest(this, this._frame).then(function(prepareReturnValue) {
+        return this._runTestAndRecordResults(state);
+    }.bind(this));
+};
+
+BenchmarkRunner.prototype.runAllSteps = function(startingState)
+{
+    var nextCallee = this.runAllSteps.bind(this);
+    this.step(startingState).then(function(nextState) {
+        if (nextState)
+            nextCallee(nextState);
+    });
+};
+
+BenchmarkRunner.prototype.runMultipleIterations = function()
+{
+    var self = this;
+    var currentIteration = 0;
+
+    this._runNextIteration = function() {
+        currentIteration++;
+        if (currentIteration &lt; self._client.iterationCount)
+            self.runAllSteps();
+        else if (this._client &amp;&amp; this._client.didFinishLastIteration)
+            self._client.didFinishLastIteration();
+    }
+
+    if (self._client &amp;&amp; self._client.willStartFirstIteration)
+        self._client.willStartFirstIteration();
+
+    self.runAllSteps();
+};
+
+BenchmarkRunner.prototype._finalize = function()
+{
+    this._removeFrame();
+        
+    if (this._client &amp;&amp; this._client.didRunSuites)
+        this._client.didRunSuites(this._suitesSamplers);
+
+    if (this._runNextIteration)
+        this._runNextIteration();
+};
</ins></span></pre></div>
<a id="trunkPerformanceTestsAnimometerresourcesdebugrunnerd3minjsfromrev194406trunkPerformanceTestsAnimometerrunnerresourcesd3minjs"></a>
<div class="copfile"><h4>Copied: trunk/PerformanceTests/Animometer/resources/debug-runner/d3.min.js (from rev 194406, trunk/PerformanceTests/Animometer/runner/resources/d3.min.js) (0 => 194407)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/PerformanceTests/Animometer/resources/debug-runner/d3.min.js                                (rev 0)
+++ trunk/PerformanceTests/Animometer/resources/debug-runner/d3.min.js        2015-12-24 01:31:47 UTC (rev 194407)
</span><span class="lines">@@ -0,0 +1,5 @@
</span><ins>+!function(){function n(n,t){return t&gt;n?-1:n&gt;t?1:n&gt;=t?0:0/0}function t(n){return null!=n&amp;&amp;!isNaN(n)}function e(n){return{left:function(t,e,r,u){for(arguments.length&lt;3&amp;&amp;(r=0),arguments.length&lt;4&amp;&amp;(u=t.length);u&gt;r;){var i=r+u&gt;&gt;&gt;1;n(t[i],e)&lt;0?r=i+1:u=i}return r},right:function(t,e,r,u){for(arguments.length&lt;3&amp;&amp;(r=0),arguments.length&lt;4&amp;&amp;(u=t.length);u&gt;r;){var i=r+u&gt;&gt;&gt;1;n(t[i],e)&gt;0?u=i:r=i+1}return r}}}function r(n){return n.length}function u(n){for(var t=1;n*t%1;)t*=10;return t}function i(n,t){try{for(var e in t)Object.defineProperty(n.prototype,e,{value:t[e],enumerable:!1})}catch(r){n.prototype=t}}function o(){}function a(n){return ia+n in this}function c(n){return n=ia+n,n in this&amp;&amp;delete this[n]}function s(){var n=[];return this.forEach(function(t){n.push(t)}),n}function l(){var n=0;for(var t in this)t.charCodeAt(0)===oa&amp;&amp;++n;return n}function f(){for(var n in t
 his)if(n.charCodeAt(0)===oa)return!1;return!0}function h(){}function g(n,t,e){return function(){var r=e.apply(t,arguments);return r===t?n:r}}function p(n,t){if(t in n)return t;t=t.charAt(0).toUpperCase()+t.substring(1);for(var e=0,r=aa.length;r&gt;e;++e){var u=aa[e]+t;if(u in n)return u}}function v(){}function d(){}function m(n){function t(){for(var t,r=e,u=-1,i=r.length;++u&lt;i;)(t=r[u].on)&amp;&amp;t.apply(this,arguments);return n}var e=[],r=new o;return t.on=function(t,u){var i,o=r.get(t);return arguments.length&lt;2?o&amp;&amp;o.on:(o&amp;&amp;(o.on=null,e=e.slice(0,i=e.indexOf(o)).concat(e.slice(i+1)),r.remove(t)),u&amp;&amp;e.push(r.set(t,{on:u})),n)},t}function y(){Zo.event.preventDefault()}function x(){for(var n,t=Zo.event;n=t.sourceEvent;)t=n;return t}function M(n){for(var t=new d,e=0,r=arguments.length;++e&lt;r;)t[arguments[e]]=m(t);return t.of=function(e,r){return function(u){try{var i=u.sourceEvent=Zo.event;u.target=n,Zo.event=u,t[u.type].apply(e,r)}finally{Zo.e
 vent=i}}},t}function _(n){return sa(n,pa),n}function b(n){return&quot;function&quot;==typeof n?n:function(){return la(n,this)}}function w(n){return&quot;function&quot;==typeof n?n:function(){return fa(n,this)}}function S(n,t){function e(){this.removeAttribute(n)}function r(){this.removeAttributeNS(n.space,n.local)}function u(){this.setAttribute(n,t)}function i(){this.setAttributeNS(n.space,n.local,t)}function o(){var e=t.apply(this,arguments);null==e?this.removeAttribute(n):this.setAttribute(n,e)}function a(){var e=t.apply(this,arguments);null==e?this.removeAttributeNS(n.space,n.local):this.setAttributeNS(n.space,n.local,e)}return n=Zo.ns.qualify(n),null==t?n.local?r:e:&quot;function&quot;==typeof t?n.local?a:o:n.local?i:u}function k(n){return n.trim().replace(/\s+/g,&quot; &quot;)}function E(n){return new RegExp(&quot;(?:^|\\s+)&quot;+Zo.requote(n)+&quot;(?:\\s+|$)&quot;,&quot;g&quot;)}function A(n){return(n+&quot;&quot;).trim().split(/^|\s+/)}function C(n,t){function e(){f
 or(var e=-1;++e&lt;u;)n[e](this,t)}function r(){for(var e=-1,r=t.apply(this,arguments);++e&lt;u;)n[e](this,r)}n=A(n).map(N);var u=n.length;return&quot;function&quot;==typeof t?r:e}function N(n){var t=E(n);return function(e,r){if(u=e.classList)return r?u.add(n):u.remove(n);var u=e.getAttribute(&quot;class&quot;)||&quot;&quot;;r?(t.lastIndex=0,t.test(u)||e.setAttribute(&quot;class&quot;,k(u+&quot; &quot;+n))):e.setAttribute(&quot;class&quot;,k(u.replace(t,&quot; &quot;)))}}function z(n,t,e){function r(){this.style.removeProperty(n)}function u(){this.style.setProperty(n,t,e)}function i(){var r=t.apply(this,arguments);null==r?this.style.removeProperty(n):this.style.setProperty(n,r,e)}return null==t?r:&quot;function&quot;==typeof t?i:u}function L(n,t){function e(){delete this[n]}function r(){this[n]=t}function u(){var e=t.apply(this,arguments);null==e?delete this[n]:this[n]=e}return null==t?e:&quot;function&quot;==typeof t?u:r}function T(n){return&quot;function&quot;==typeof n?n:
 (n=Zo.ns.qualify(n)).local?function(){return this.ownerDocument.createElementNS(n.space,n.local)}:function(){return this.ownerDocument.createElementNS(this.namespaceURI,n)}}function q(n){return{__data__:n}}function R(n){return function(){return ga(this,n)}}function D(t){return arguments.length||(t=n),function(n,e){return n&amp;&amp;e?t(n.__data__,e.__data__):!n-!e}}function P(n,t){for(var e=0,r=n.length;r&gt;e;e++)for(var u,i=n[e],o=0,a=i.length;a&gt;o;o++)(u=i[o])&amp;&amp;t(u,o,e);return n}function U(n){return sa(n,da),n}function j(n){var t,e;return function(r,u,i){var o,a=n[i].update,c=a.length;for(i!=e&amp;&amp;(e=i,t=0),u&gt;=t&amp;&amp;(t=u+1);!(o=a[t])&amp;&amp;++t&lt;c;);return o}}function H(){var n=this.__transition__;n&amp;&amp;++n.active}function F(n,t,e){function r(){var t=this[o];t&amp;&amp;(this.removeEventListener(n,t,t.$),delete this[o])}function u(){var u=c(t,Xo(arguments));r.call(this),this.addEventListener(n,this[o]=u,u.$=e),u._=t}function i(){var t,e=new 
 RegExp(&quot;^__on([^.]+)&quot;+Zo.requote(n)+&quot;$&quot;);for(var r in this)if(t=r.match(e)){var u=this[r];this.removeEventListener(t[1],u,u.$),delete this[r]}}var o=&quot;__on&quot;+n,a=n.indexOf(&quot;.&quot;),c=O;a&gt;0&amp;&amp;(n=n.substring(0,a));var s=ya.get(n);return s&amp;&amp;(n=s,c=Y),a?t?u:r:t?v:i}function O(n,t){return function(e){var r=Zo.event;Zo.event=e,t[0]=this.__data__;try{n.apply(this,t)}finally{Zo.event=r}}}function Y(n,t){var e=O(n,t);return function(n){var t=this,r=n.relatedTarget;r&amp;&amp;(r===t||8&amp;r.compareDocumentPosition(t))||e.call(t,n)}}function I(){var n=&quot;.dragsuppress-&quot;+ ++Ma,t=&quot;click&quot;+n,e=Zo.select(Wo).on(&quot;touchmove&quot;+n,y).on(&quot;dragstart&quot;+n,y).on(&quot;selectstart&quot;+n,y);if(xa){var r=Bo.style,u=r[xa];r[xa]=&quot;none&quot;}return function(i){function o(){e.on(t,null)}e.on(n,null),xa&amp;&amp;(r[xa]=u),i&amp;&amp;(e.on(t,function(){y(),o()},!0),setTimeout(o,0))}}function Z(n,t){t.changedTouches
 &amp;&amp;(t=t.changedTouches[0]);var e=n.ownerSVGElement||n;if(e.createSVGPoint){var r=e.createSVGPoint();if(0&gt;_a&amp;&amp;(Wo.scrollX||Wo.scrollY)){e=Zo.select(&quot;body&quot;).append(&quot;svg&quot;).style({position:&quot;absolute&quot;,top:0,left:0,margin:0,padding:0,border:&quot;none&quot;},&quot;important&quot;);var u=e[0][0].getScreenCTM();_a=!(u.f||u.e),e.remove()}return _a?(r.x=t.pageX,r.y=t.pageY):(r.x=t.clientX,r.y=t.clientY),r=r.matrixTransform(n.getScreenCTM().inverse()),[r.x,r.y]}var i=n.getBoundingClientRect();return[t.clientX-i.left-n.clientLeft,t.clientY-i.top-n.clientTop]}function V(){return Zo.event.changedTouches[0].identifier}function X(){return Zo.event.target}function $(){return Wo}function B(n){return n&gt;0?1:0&gt;n?-1:0}function W(n,t,e){return(t[0]-n[0])*(e[1]-n[1])-(t[1]-n[1])*(e[0]-n[0])}function J(n){return n&gt;1?0:-1&gt;n?ba:Math.acos(n)}function G(n){return n&gt;1?Sa:-1&gt;n?-Sa:Math.asin(n)}function K(n){return((n=Math.exp(n))-1/n)/2}fun
 ction Q(n){return((n=Math.exp(n))+1/n)/2}function nt(n){return((n=Math.exp(2*n))-1)/(n+1)}function tt(n){return(n=Math.sin(n/2))*n}function et(){}function rt(n,t,e){return this instanceof rt?(this.h=+n,this.s=+t,void(this.l=+e)):arguments.length&lt;2?n instanceof rt?new rt(n.h,n.s,n.l):mt(&quot;&quot;+n,yt,rt):new rt(n,t,e)}function ut(n,t,e){function r(n){return n&gt;360?n-=360:0&gt;n&amp;&amp;(n+=360),60&gt;n?i+(o-i)*n/60:180&gt;n?o:240&gt;n?i+(o-i)*(240-n)/60:i}function u(n){return Math.round(255*r(n))}var i,o;return n=isNaN(n)?0:(n%=360)&lt;0?n+360:n,t=isNaN(t)?0:0&gt;t?0:t&gt;1?1:t,e=0&gt;e?0:e&gt;1?1:e,o=.5&gt;=e?e*(1+t):e+t-e*t,i=2*e-o,new gt(u(n+120),u(n),u(n-120))}function it(n,t,e){return this instanceof it?(this.h=+n,this.c=+t,void(this.l=+e)):arguments.length&lt;2?n instanceof it?new it(n.h,n.c,n.l):n instanceof at?st(n.l,n.a,n.b):st((n=xt((n=Zo.rgb(n)).r,n.g,n.b)).l,n.a,n.b):new it(n,t,e)}function ot(n,t,e){return isNaN(n)&amp;&amp;(n=0),isNaN(t)&amp;&amp;(t=0),
 new at(e,Math.cos(n*=Aa)*t,Math.sin(n)*t)}function at(n,t,e){return this instanceof at?(this.l=+n,this.a=+t,void(this.b=+e)):arguments.length&lt;2?n instanceof at?new at(n.l,n.a,n.b):n instanceof it?ot(n.l,n.c,n.h):xt((n=gt(n)).r,n.g,n.b):new at(n,t,e)}function ct(n,t,e){var r=(n+16)/116,u=r+t/500,i=r-e/200;return u=lt(u)*ja,r=lt(r)*Ha,i=lt(i)*Fa,new gt(ht(3.2404542*u-1.5371385*r-.4985314*i),ht(-.969266*u+1.8760108*r+.041556*i),ht(.0556434*u-.2040259*r+1.0572252*i))}function st(n,t,e){return n&gt;0?new it(Math.atan2(e,t)*Ca,Math.sqrt(t*t+e*e),n):new it(0/0,0/0,n)}function lt(n){return n&gt;.206893034?n*n*n:(n-4/29)/7.787037}function ft(n){return n&gt;.008856?Math.pow(n,1/3):7.787037*n+4/29}function ht(n){return Math.round(255*(.00304&gt;=n?12.92*n:1.055*Math.pow(n,1/2.4)-.055))}function gt(n,t,e){return this instanceof gt?(this.r=~~n,this.g=~~t,void(this.b=~~e)):arguments.length&lt;2?n instanceof gt?new gt(n.r,n.g,n.b):mt(&quot;&quot;+n,gt,ut):new gt(n,t,e)}function pt(n){re
 turn new gt(n&gt;&gt;16,255&amp;n&gt;&gt;8,255&amp;n)}function vt(n){return pt(n)+&quot;&quot;}function dt(n){return 16&gt;n?&quot;0&quot;+Math.max(0,n).toString(16):Math.min(255,n).toString(16)}function mt(n,t,e){var r,u,i,o=0,a=0,c=0;if(r=/([a-z]+)\((.*)\)/i.exec(n))switch(u=r[2].split(&quot;,&quot;),r[1]){case&quot;hsl&quot;:return e(parseFloat(u[0]),parseFloat(u[1])/100,parseFloat(u[2])/100);case&quot;rgb&quot;:return t(_t(u[0]),_t(u[1]),_t(u[2]))}return(i=Ia.get(n))?t(i.r,i.g,i.b):(null==n||&quot;#&quot;!==n.charAt(0)||isNaN(i=parseInt(n.substring(1),16))||(4===n.length?(o=(3840&amp;i)&gt;&gt;4,o=o&gt;&gt;4|o,a=240&amp;i,a=a&gt;&gt;4|a,c=15&amp;i,c=c&lt;&lt;4|c):7===n.length&amp;&amp;(o=(16711680&amp;i)&gt;&gt;16,a=(65280&amp;i)&gt;&gt;8,c=255&amp;i)),t(o,a,c))}function yt(n,t,e){var r,u,i=Math.min(n/=255,t/=255,e/=255),o=Math.max(n,t,e),a=o-i,c=(o+i)/2;return a?(u=.5&gt;c?a/(o+i):a/(2-o-i),r=n==o?(t-e)/a+(e&gt;t?6:0):t==o?(e-n)/a+2:(n-t)/a+4,r*=60):(r=0/0,u=c&gt;0&amp;
 &amp;1&gt;c?0:r),new rt(r,u,c)}function xt(n,t,e){n=Mt(n),t=Mt(t),e=Mt(e);var r=ft((.4124564*n+.3575761*t+.1804375*e)/ja),u=ft((.2126729*n+.7151522*t+.072175*e)/Ha),i=ft((.0193339*n+.119192*t+.9503041*e)/Fa);return at(116*u-16,500*(r-u),200*(u-i))}function Mt(n){return(n/=255)&lt;=.04045?n/12.92:Math.pow((n+.055)/1.055,2.4)}function _t(n){var t=parseFloat(n);return&quot;%&quot;===n.charAt(n.length-1)?Math.round(2.55*t):t}function bt(n){return&quot;function&quot;==typeof n?n:function(){return n}}function wt(n){return n}function St(n){return function(t,e,r){return 2===arguments.length&amp;&amp;&quot;function&quot;==typeof e&amp;&amp;(r=e,e=null),kt(t,e,n,r)}}function kt(n,t,e,r){function u(){var n,t=c.status;if(!t&amp;&amp;c.responseText||t&gt;=200&amp;&amp;300&gt;t||304===t){try{n=e.call(i,c)}catch(r){return o.error.call(i,r),void 0}o.load.call(i,n)}else o.error.call(i,c)}var i={},o=Zo.dispatch(&quot;beforesend&quot;,&quot;progress&quot;,&quot;load&quot;,&quot;error&quot;),a=
 {},c=new XMLHttpRequest,s=null;return!Wo.XDomainRequest||&quot;withCredentials&quot;in c||!/^(http(s)?:)?\/\//.test(n)||(c=new XDomainRequest),&quot;onload&quot;in c?c.onload=c.onerror=u:c.onreadystatechange=function(){c.readyState&gt;3&amp;&amp;u()},c.onprogress=function(n){var t=Zo.event;Zo.event=n;try{o.progress.call(i,c)}finally{Zo.event=t}},i.header=function(n,t){return n=(n+&quot;&quot;).toLowerCase(),arguments.length&lt;2?a[n]:(null==t?delete a[n]:a[n]=t+&quot;&quot;,i)},i.mimeType=function(n){return arguments.length?(t=null==n?null:n+&quot;&quot;,i):t},i.responseType=function(n){return arguments.length?(s=n,i):s},i.response=function(n){return e=n,i},[&quot;get&quot;,&quot;post&quot;].forEach(function(n){i[n]=function(){return i.send.apply(i,[n].concat(Xo(arguments)))}}),i.send=function(e,r,u){if(2===arguments.length&amp;&amp;&quot;function&quot;==typeof r&amp;&amp;(u=r,r=null),c.open(e,n,!0),null==t||&quot;accept&quot;in a||(a.accept=t+&quot;,*/*&quot;),c.setRequestH
 eader)for(var l in a)c.setRequestHeader(l,a[l]);return null!=t&amp;&amp;c.overrideMimeType&amp;&amp;c.overrideMimeType(t),null!=s&amp;&amp;(c.responseType=s),null!=u&amp;&amp;i.on(&quot;error&quot;,u).on(&quot;load&quot;,function(n){u(null,n)}),o.beforesend.call(i,c),c.send(null==r?null:r),i},i.abort=function(){return c.abort(),i},Zo.rebind(i,o,&quot;on&quot;),null==r?i:i.get(Et(r))}function Et(n){return 1===n.length?function(t,e){n(null==t?e:null)}:n}function At(){var n=Ct(),t=Nt()-n;t&gt;24?(isFinite(t)&amp;&amp;(clearTimeout($a),$a=setTimeout(At,t)),Xa=0):(Xa=1,Wa(At))}function Ct(){var n=Date.now();for(Ba=Za;Ba;)n&gt;=Ba.t&amp;&amp;(Ba.f=Ba.c(n-Ba.t)),Ba=Ba.n;return n}function Nt(){for(var n,t=Za,e=1/0;t;)t.f?t=n?n.n=t.n:Za=t.n:(t.t&lt;e&amp;&amp;(e=t.t),t=(n=t).n);return Va=n,e}function zt(n,t){return t-(n?Math.ceil(Math.log(n)/Math.LN10):1)}function Lt(n,t){var e=Math.pow(10,3*ua(8-t));return{scale:t&gt;8?function(n){return n/e}:function(n){return n*e},symbol:n}}functi
 on Tt(n){var t=n.decimal,e=n.thousands,r=n.grouping,u=n.currency,i=r?function(n){for(var t=n.length,u=[],i=0,o=r[0];t&gt;0&amp;&amp;o&gt;0;)u.push(n.substring(t-=o,t+o)),o=r[i=(i+1)%r.length];return u.reverse().join(e)}:wt;return function(n){var e=Ga.exec(n),r=e[1]||&quot; &quot;,o=e[2]||&quot;&gt;&quot;,a=e[3]||&quot;&quot;,c=e[4]||&quot;&quot;,s=e[5],l=+e[6],f=e[7],h=e[8],g=e[9],p=1,v=&quot;&quot;,d=&quot;&quot;,m=!1;switch(h&amp;&amp;(h=+h.substring(1)),(s||&quot;0&quot;===r&amp;&amp;&quot;=&quot;===o)&amp;&amp;(s=r=&quot;0&quot;,o=&quot;=&quot;,f&amp;&amp;(l-=Math.floor((l-1)/4))),g){case&quot;n&quot;:f=!0,g=&quot;g&quot;;break;case&quot;%&quot;:p=100,d=&quot;%&quot;,g=&quot;f&quot;;break;case&quot;p&quot;:p=100,d=&quot;%&quot;,g=&quot;r&quot;;break;case&quot;b&quot;:case&quot;o&quot;:case&quot;x&quot;:case&quot;X&quot;:&quot;#&quot;===c&amp;&amp;(v=&quot;0&quot;+g.toLowerCase());case&quot;c&quot;:case&quot;d&quot;:m=!0,h=0;break;case&quot;s&quot;:p=-1,g=&quot;r&quot;}&q
 uot;$&quot;===c&amp;&amp;(v=u[0],d=u[1]),&quot;r&quot;!=g||h||(g=&quot;g&quot;),null!=h&amp;&amp;(&quot;g&quot;==g?h=Math.max(1,Math.min(21,h)):(&quot;e&quot;==g||&quot;f&quot;==g)&amp;&amp;(h=Math.max(0,Math.min(20,h)))),g=Ka.get(g)||qt;var y=s&amp;&amp;f;return function(n){var e=d;if(m&amp;&amp;n%1)return&quot;&quot;;var u=0&gt;n||0===n&amp;&amp;0&gt;1/n?(n=-n,&quot;-&quot;):a;if(0&gt;p){var c=Zo.formatPrefix(n,h);n=c.scale(n),e=c.symbol+d}else n*=p;n=g(n,h);var x=n.lastIndexOf(&quot;.&quot;),M=0&gt;x?n:n.substring(0,x),_=0&gt;x?&quot;&quot;:t+n.substring(x+1);!s&amp;&amp;f&amp;&amp;(M=i(M));var b=v.length+M.length+_.length+(y?0:u.length),w=l&gt;b?new Array(b=l-b+1).join(r):&quot;&quot;;return y&amp;&amp;(M=i(w+M)),u+=v,n=M+_,(&quot;&lt;&quot;===o?u+n+w:&quot;&gt;&quot;===o?w+u+n:&quot;^&quot;===o?w.substring(0,b&gt;&gt;=1)+u+n+w.substring(b):u+(y?n:w+n))+e}}}function qt(n){return n+&quot;&quot;}function Rt(){this._=new Date(arguments.length&gt;1?Date.UTC.apply(this,argume
 nts):arguments[0])}function Dt(n,t,e){function r(t){var e=n(t),r=i(e,1);return r-t&gt;t-e?e:r}function u(e){return t(e=n(new nc(e-1)),1),e}function i(n,e){return t(n=new nc(+n),e),n}function o(n,r,i){var o=u(n),a=[];if(i&gt;1)for(;r&gt;o;)e(o)%i||a.push(new Date(+o)),t(o,1);else for(;r&gt;o;)a.push(new Date(+o)),t(o,1);return a}function a(n,t,e){try{nc=Rt;var r=new Rt;return r._=n,o(r,t,e)}finally{nc=Date}}n.floor=n,n.round=r,n.ceil=u,n.offset=i,n.range=o;var c=n.utc=Pt(n);return c.floor=c,c.round=Pt(r),c.ceil=Pt(u),c.offset=Pt(i),c.range=a,n}function Pt(n){return function(t,e){try{nc=Rt;var r=new Rt;return r._=t,n(r,e)._}finally{nc=Date}}}function Ut(n){function t(n){function t(t){for(var e,u,i,o=[],a=-1,c=0;++a&lt;r;)37===n.charCodeAt(a)&amp;&amp;(o.push(n.substring(c,a)),null!=(u=ec[e=n.charAt(++a)])&amp;&amp;(e=n.charAt(++a)),(i=C[e])&amp;&amp;(e=i(t,null==u?&quot;e&quot;===e?&quot; &quot;:&quot;0&quot;:u)),o.push(e),c=a+1);return o.push(n.substring(c,a)),o.join(&quot;&q
 uot;)}var r=n.length;return t.parse=function(t){var r={y:1900,m:0,d:1,H:0,M:0,S:0,L:0,Z:null},u=e(r,n,t,0);if(u!=t.length)return null;&quot;p&quot;in r&amp;&amp;(r.H=r.H%12+12*r.p);var i=null!=r.Z&amp;&amp;nc!==Rt,o=new(i?Rt:nc);return&quot;j&quot;in r?o.setFullYear(r.y,0,r.j):&quot;w&quot;in r&amp;&amp;(&quot;W&quot;in r||&quot;U&quot;in r)?(o.setFullYear(r.y,0,1),o.setFullYear(r.y,0,&quot;W&quot;in r?(r.w+6)%7+7*r.W-(o.getDay()+5)%7:r.w+7*r.U-(o.getDay()+6)%7)):o.setFullYear(r.y,r.m,r.d),o.setHours(r.H+Math.floor(r.Z/100),r.M+r.Z%100,r.S,r.L),i?o._:o},t.toString=function(){return n},t}function e(n,t,e,r){for(var u,i,o,a=0,c=t.length,s=e.length;c&gt;a;){if(r&gt;=s)return-1;if(u=t.charCodeAt(a++),37===u){if(o=t.charAt(a++),i=N[o in ec?t.charAt(a++):o],!i||(r=i(n,e,r))&lt;0)return-1}else if(u!=e.charCodeAt(r++))return-1}return r}function r(n,t,e){b.lastIndex=0;var r=b.exec(t.substring(e));return r?(n.w=w.get(r[0].toLowerCase()),e+r[0].length):-1}function u(n,t,e){M.lastIndex=
 0;var r=M.exec(t.substring(e));return r?(n.w=_.get(r[0].toLowerCase()),e+r[0].length):-1}function i(n,t,e){E.lastIndex=0;var r=E.exec(t.substring(e));return r?(n.m=A.get(r[0].toLowerCase()),e+r[0].length):-1}function o(n,t,e){S.lastIndex=0;var r=S.exec(t.substring(e));return r?(n.m=k.get(r[0].toLowerCase()),e+r[0].length):-1}function a(n,t,r){return e(n,C.c.toString(),t,r)}function c(n,t,r){return e(n,C.x.toString(),t,r)}function s(n,t,r){return e(n,C.X.toString(),t,r)}function l(n,t,e){var r=x.get(t.substring(e,e+=2).toLowerCase());return null==r?-1:(n.p=r,e)}var f=n.dateTime,h=n.date,g=n.time,p=n.periods,v=n.days,d=n.shortDays,m=n.months,y=n.shortMonths;t.utc=function(n){function e(n){try{nc=Rt;var t=new nc;return t._=n,r(t)}finally{nc=Date}}var r=t(n);return e.parse=function(n){try{nc=Rt;var t=r.parse(n);return t&amp;&amp;t._}finally{nc=Date}},e.toString=r.toString,e},t.multi=t.utc.multi=re;var x=Zo.map(),M=Ht(v),_=Ft(v),b=Ht(d),w=Ft(d),S=Ht(m),k=Ft(m),E=Ht(y),A=Ft(y);p.f
 orEach(function(n,t){x.set(n.toLowerCase(),t)});var C={a:function(n){return d[n.getDay()]},A:function(n){return v[n.getDay()]},b:function(n){return y[n.getMonth()]},B:function(n){return m[n.getMonth()]},c:t(f),d:function(n,t){return jt(n.getDate(),t,2)},e:function(n,t){return jt(n.getDate(),t,2)},H:function(n,t){return jt(n.getHours(),t,2)},I:function(n,t){return jt(n.getHours()%12||12,t,2)},j:function(n,t){return jt(1+Qa.dayOfYear(n),t,3)},L:function(n,t){return jt(n.getMilliseconds(),t,3)},m:function(n,t){return jt(n.getMonth()+1,t,2)},M:function(n,t){return jt(n.getMinutes(),t,2)},p:function(n){return p[+(n.getHours()&gt;=12)]},S:function(n,t){return jt(n.getSeconds(),t,2)},U:function(n,t){return jt(Qa.sundayOfYear(n),t,2)},w:function(n){return n.getDay()},W:function(n,t){return jt(Qa.mondayOfYear(n),t,2)},x:t(h),X:t(g),y:function(n,t){return jt(n.getFullYear()%100,t,2)},Y:function(n,t){return jt(n.getFullYear()%1e4,t,4)},Z:te,&quot;%&quot;:function(){return&quot;%&quot;}
 },N={a:r,A:u,b:i,B:o,c:a,d:Wt,e:Wt,H:Gt,I:Gt,j:Jt,L:ne,m:Bt,M:Kt,p:l,S:Qt,U:Yt,w:Ot,W:It,x:c,X:s,y:Vt,Y:Zt,Z:Xt,&quot;%&quot;:ee};return t}function jt(n,t,e){var r=0&gt;n?&quot;-&quot;:&quot;&quot;,u=(r?-n:n)+&quot;&quot;,i=u.length;return r+(e&gt;i?new Array(e-i+1).join(t)+u:u)}function Ht(n){return new RegExp(&quot;^(?:&quot;+n.map(Zo.requote).join(&quot;|&quot;)+&quot;)&quot;,&quot;i&quot;)}function Ft(n){for(var t=new o,e=-1,r=n.length;++e&lt;r;)t.set(n[e].toLowerCase(),e);return t}function Ot(n,t,e){rc.lastIndex=0;var r=rc.exec(t.substring(e,e+1));return r?(n.w=+r[0],e+r[0].length):-1}function Yt(n,t,e){rc.lastIndex=0;var r=rc.exec(t.substring(e));return r?(n.U=+r[0],e+r[0].length):-1}function It(n,t,e){rc.lastIndex=0;var r=rc.exec(t.substring(e));return r?(n.W=+r[0],e+r[0].length):-1}function Zt(n,t,e){rc.lastIndex=0;var r=rc.exec(t.substring(e,e+4));return r?(n.y=+r[0],e+r[0].length):-1}function Vt(n,t,e){rc.lastIndex=0;var r=rc.exec(t.substring(e,e+2));return r?(n.y=
 $t(+r[0]),e+r[0].length):-1}function Xt(n,t,e){return/^[+-]\d{4}$/.test(t=t.substring(e,e+5))?(n.Z=-t,e+5):-1}function $t(n){return n+(n&gt;68?1900:2e3)}function Bt(n,t,e){rc.lastIndex=0;var r=rc.exec(t.substring(e,e+2));return r?(n.m=r[0]-1,e+r[0].length):-1}function Wt(n,t,e){rc.lastIndex=0;var r=rc.exec(t.substring(e,e+2));return r?(n.d=+r[0],e+r[0].length):-1}function Jt(n,t,e){rc.lastIndex=0;var r=rc.exec(t.substring(e,e+3));return r?(n.j=+r[0],e+r[0].length):-1}function Gt(n,t,e){rc.lastIndex=0;var r=rc.exec(t.substring(e,e+2));return r?(n.H=+r[0],e+r[0].length):-1}function Kt(n,t,e){rc.lastIndex=0;var r=rc.exec(t.substring(e,e+2));return r?(n.M=+r[0],e+r[0].length):-1}function Qt(n,t,e){rc.lastIndex=0;var r=rc.exec(t.substring(e,e+2));return r?(n.S=+r[0],e+r[0].length):-1}function ne(n,t,e){rc.lastIndex=0;var r=rc.exec(t.substring(e,e+3));return r?(n.L=+r[0],e+r[0].length):-1}function te(n){var t=n.getTimezoneOffset(),e=t&gt;0?&quot;-&quot;:&quot;+&quot;,r=~~(ua(t)/60
 ),u=ua(t)%60;return e+jt(r,&quot;0&quot;,2)+jt(u,&quot;0&quot;,2)}function ee(n,t,e){uc.lastIndex=0;var r=uc.exec(t.substring(e,e+1));return r?e+r[0].length:-1}function re(n){for(var t=n.length,e=-1;++e&lt;t;)n[e][0]=this(n[e][0]);return function(t){for(var e=0,r=n[e];!r[1](t);)r=n[++e];return r[0](t)}}function ue(){}function ie(n,t,e){var r=e.s=n+t,u=r-n,i=r-u;e.t=n-i+(t-u)}function oe(n,t){n&amp;&amp;cc.hasOwnProperty(n.type)&amp;&amp;cc[n.type](n,t)}function ae(n,t,e){var r,u=-1,i=n.length-e;for(t.lineStart();++u&lt;i;)r=n[u],t.point(r[0],r[1],r[2]);t.lineEnd()}function ce(n,t){var e=-1,r=n.length;for(t.polygonStart();++e&lt;r;)ae(n[e],t,1);t.polygonEnd()}function se(){function n(n,t){n*=Aa,t=t*Aa/2+ba/4;var e=n-r,o=e&gt;=0?1:-1,a=o*e,c=Math.cos(t),s=Math.sin(t),l=i*s,f=u*c+l*Math.cos(a),h=l*o*Math.sin(a);lc.add(Math.atan2(h,f)),r=n,u=c,i=s}var t,e,r,u,i;fc.point=function(o,a){fc.point=n,r=(t=o)*Aa,u=Math.cos(a=(e=a)*Aa/2+ba/4),i=Math.sin(a)},fc.lineEnd=function(){n(t,e)}
 }function le(n){var t=n[0],e=n[1],r=Math.cos(e);return[r*Math.cos(t),r*Math.sin(t),Math.sin(e)]}function fe(n,t){return n[0]*t[0]+n[1]*t[1]+n[2]*t[2]}function he(n,t){return[n[1]*t[2]-n[2]*t[1],n[2]*t[0]-n[0]*t[2],n[0]*t[1]-n[1]*t[0]]}function ge(n,t){n[0]+=t[0],n[1]+=t[1],n[2]+=t[2]}function pe(n,t){return[n[0]*t,n[1]*t,n[2]*t]}function ve(n){var t=Math.sqrt(n[0]*n[0]+n[1]*n[1]+n[2]*n[2]);n[0]/=t,n[1]/=t,n[2]/=t}function de(n){return[Math.atan2(n[1],n[0]),G(n[2])]}function me(n,t){return ua(n[0]-t[0])&lt;ka&amp;&amp;ua(n[1]-t[1])&lt;ka}function ye(n,t){n*=Aa;var e=Math.cos(t*=Aa);xe(e*Math.cos(n),e*Math.sin(n),Math.sin(t))}function xe(n,t,e){++hc,pc+=(n-pc)/hc,vc+=(t-vc)/hc,dc+=(e-dc)/hc}function Me(){function n(n,u){n*=Aa;var i=Math.cos(u*=Aa),o=i*Math.cos(n),a=i*Math.sin(n),c=Math.sin(u),s=Math.atan2(Math.sqrt((s=e*c-r*a)*s+(s=r*o-t*c)*s+(s=t*a-e*o)*s),t*o+e*a+r*c);gc+=s,mc+=s*(t+(t=o)),yc+=s*(e+(e=a)),xc+=s*(r+(r=c)),xe(t,e,r)}var t,e,r;wc.point=function(u,i){u*=Aa;var o
 =Math.cos(i*=Aa);t=o*Math.cos(u),e=o*Math.sin(u),r=Math.sin(i),wc.point=n,xe(t,e,r)}}function _e(){wc.point=ye}function be(){function n(n,t){n*=Aa;var e=Math.cos(t*=Aa),o=e*Math.cos(n),a=e*Math.sin(n),c=Math.sin(t),s=u*c-i*a,l=i*o-r*c,f=r*a-u*o,h=Math.sqrt(s*s+l*l+f*f),g=r*o+u*a+i*c,p=h&amp;&amp;-J(g)/h,v=Math.atan2(h,g);Mc+=p*s,_c+=p*l,bc+=p*f,gc+=v,mc+=v*(r+(r=o)),yc+=v*(u+(u=a)),xc+=v*(i+(i=c)),xe(r,u,i)}var t,e,r,u,i;wc.point=function(o,a){t=o,e=a,wc.point=n,o*=Aa;var c=Math.cos(a*=Aa);r=c*Math.cos(o),u=c*Math.sin(o),i=Math.sin(a),xe(r,u,i)},wc.lineEnd=function(){n(t,e),wc.lineEnd=_e,wc.point=ye}}function we(){return!0}function Se(n,t,e,r,u){var i=[],o=[];if(n.forEach(function(n){if(!((t=n.length-1)&lt;=0)){var t,e=n[0],r=n[t];if(me(e,r)){u.lineStart();for(var a=0;t&gt;a;++a)u.point((e=n[a])[0],e[1]);return u.lineEnd(),void 0}var c=new Ee(e,n,null,!0),s=new Ee(e,null,c,!1);c.o=s,i.push(c),o.push(s),c=new Ee(r,n,null,!1),s=new Ee(r,null,c,!0),c.o=s,i.push(c),o.push(s)}}),
 o.sort(t),ke(i),ke(o),i.length){for(var a=0,c=e,s=o.length;s&gt;a;++a)o[a].e=c=!c;for(var l,f,h=i[0];;){for(var g=h,p=!0;g.v;)if((g=g.n)===h)return;l=g.z,u.lineStart();do{if(g.v=g.o.v=!0,g.e){if(p)for(var a=0,s=l.length;s&gt;a;++a)u.point((f=l[a])[0],f[1]);else r(g.x,g.n.x,1,u);g=g.n}else{if(p){l=g.p.z;for(var a=l.length-1;a&gt;=0;--a)u.point((f=l[a])[0],f[1])}else r(g.x,g.p.x,-1,u);g=g.p}g=g.o,l=g.z,p=!p}while(!g.v);u.lineEnd()}}}function ke(n){if(t=n.length){for(var t,e,r=0,u=n[0];++r&lt;t;)u.n=e=n[r],e.p=u,u=e;u.n=e=n[0],e.p=u}}function Ee(n,t,e,r){this.x=n,this.z=t,this.o=e,this.e=r,this.v=!1,this.n=this.p=null}function Ae(n,t,e,r){return function(u,i){function o(t,e){var r=u(t,e);n(t=r[0],e=r[1])&amp;&amp;i.point(t,e)}function a(n,t){var e=u(n,t);d.point(e[0],e[1])}function c(){y.point=a,d.lineStart()}function s(){y.point=o,d.lineEnd()}function l(n,t){v.push([n,t]);var e=u(n,t);M.point(e[0],e[1])}function f(){M.lineStart(),v=[]}function h(){l(v[0][0],v[0][1]),M.lineEnd(
 );var n,t=M.clean(),e=x.buffer(),r=e.length;if(v.pop(),p.push(v),v=null,r)if(1&amp;t){n=e[0];var u,r=n.length-1,o=-1;if(r&gt;0){for(_||(i.polygonStart(),_=!0),i.lineStart();++o&lt;r;)i.point((u=n[o])[0],u[1]);i.lineEnd()}}else r&gt;1&amp;&amp;2&amp;t&amp;&amp;e.push(e.pop().concat(e.shift())),g.push(e.filter(Ce))}var g,p,v,d=t(i),m=u.invert(r[0],r[1]),y={point:o,lineStart:c,lineEnd:s,polygonStart:function(){y.point=l,y.lineStart=f,y.lineEnd=h,g=[],p=[]},polygonEnd:function(){y.point=o,y.lineStart=c,y.lineEnd=s,g=Zo.merge(g);var n=Le(m,p);g.length?(_||(i.polygonStart(),_=!0),Se(g,ze,n,e,i)):n&amp;&amp;(_||(i.polygonStart(),_=!0),i.lineStart(),e(null,null,1,i),i.lineEnd()),_&amp;&amp;(i.polygonEnd(),_=!1),g=p=null},sphere:function(){i.polygonStart(),i.lineStart(),e(null,null,1,i),i.lineEnd(),i.polygonEnd()}},x=Ne(),M=t(x),_=!1;return y}}function Ce(n){return n.length&gt;1}function Ne(){var n,t=[];return{lineStart:function(){t.push(n=[])},point:function(t,e){n.push([t,e])},line
 End:v,buffer:function(){var e=t;return t=[],n=null,e},rejoin:function(){t.length&gt;1&amp;&amp;t.push(t.pop().concat(t.shift()))}}}function ze(n,t){return((n=n.x)[0]&lt;0?n[1]-Sa-ka:Sa-n[1])-((t=t.x)[0]&lt;0?t[1]-Sa-ka:Sa-t[1])}function Le(n,t){var e=n[0],r=n[1],u=[Math.sin(e),-Math.cos(e),0],i=0,o=0;lc.reset();for(var a=0,c=t.length;c&gt;a;++a){var s=t[a],l=s.length;if(l)for(var f=s[0],h=f[0],g=f[1]/2+ba/4,p=Math.sin(g),v=Math.cos(g),d=1;;){d===l&amp;&amp;(d=0),n=s[d];var m=n[0],y=n[1]/2+ba/4,x=Math.sin(y),M=Math.cos(y),_=m-h,b=_&gt;=0?1:-1,w=b*_,S=w&gt;ba,k=p*x;if(lc.add(Math.atan2(k*b*Math.sin(w),v*M+k*Math.cos(w))),i+=S?_+b*wa:_,S^h&gt;=e^m&gt;=e){var E=he(le(f),le(n));ve(E);var A=he(u,E);ve(A);var C=(S^_&gt;=0?-1:1)*G(A[2]);(r&gt;C||r===C&amp;&amp;(E[0]||E[1]))&amp;&amp;(o+=S^_&gt;=0?1:-1)}if(!d++)break;h=m,p=x,v=M,f=n}}return(-ka&gt;i||ka&gt;i&amp;&amp;0&gt;lc)^1&amp;o}function Te(n){var t,e=0/0,r=0/0,u=0/0;return{lineStart:function(){n.lineStart(),t=1},point:function(
 i,o){var a=i&gt;0?ba:-ba,c=ua(i-e);ua(c-ba)&lt;ka?(n.point(e,r=(r+o)/2&gt;0?Sa:-Sa),n.point(u,r),n.lineEnd(),n.lineStart(),n.point(a,r),n.point(i,r),t=0):u!==a&amp;&amp;c&gt;=ba&amp;&amp;(ua(e-u)&lt;ka&amp;&amp;(e-=u*ka),ua(i-a)&lt;ka&amp;&amp;(i-=a*ka),r=qe(e,r,i,o),n.point(u,r),n.lineEnd(),n.lineStart(),n.point(a,r),t=0),n.point(e=i,r=o),u=a},lineEnd:function(){n.lineEnd(),e=r=0/0},clean:function(){return 2-t}}}function qe(n,t,e,r){var u,i,o=Math.sin(n-e);return ua(o)&gt;ka?Math.atan((Math.sin(t)*(i=Math.cos(r))*Math.sin(e)-Math.sin(r)*(u=Math.cos(t))*Math.sin(n))/(u*i*o)):(t+r)/2}function Re(n,t,e,r){var u;if(null==n)u=e*Sa,r.point(-ba,u),r.point(0,u),r.point(ba,u),r.point(ba,0),r.point(ba,-u),r.point(0,-u),r.point(-ba,-u),r.point(-ba,0),r.point(-ba,u);else if(ua(n[0]-t[0])&gt;ka){var i=n[0]&lt;t[0]?ba:-ba;u=e*i/2,r.point(-i,u),r.point(0,u),r.point(i,u)}else r.point(t[0],t[1])}function De(n){function t(n,t){return Math.cos(n)*Math.cos(t)&gt;i}function e(n){var e,i,c,s,l;r
 eturn{lineStart:function(){s=c=!1,l=1},point:function(f,h){var g,p=[f,h],v=t(f,h),d=o?v?0:u(f,h):v?u(f+(0&gt;f?ba:-ba),h):0;if(!e&amp;&amp;(s=c=v)&amp;&amp;n.lineStart(),v!==c&amp;&amp;(g=r(e,p),(me(e,g)||me(p,g))&amp;&amp;(p[0]+=ka,p[1]+=ka,v=t(p[0],p[1]))),v!==c)l=0,v?(n.lineStart(),g=r(p,e),n.point(g[0],g[1])):(g=r(e,p),n.point(g[0],g[1]),n.lineEnd()),e=g;else if(a&amp;&amp;e&amp;&amp;o^v){var m;d&amp;i||!(m=r(p,e,!0))||(l=0,o?(n.lineStart(),n.point(m[0][0],m[0][1]),n.point(m[1][0],m[1][1]),n.lineEnd()):(n.point(m[1][0],m[1][1]),n.lineEnd(),n.lineStart(),n.point(m[0][0],m[0][1])))}!v||e&amp;&amp;me(e,p)||n.point(p[0],p[1]),e=p,c=v,i=d},lineEnd:function(){c&amp;&amp;n.lineEnd(),e=null},clean:function(){return l|(s&amp;&amp;c)&lt;&lt;1}}}function r(n,t,e){var r=le(n),u=le(t),o=[1,0,0],a=he(r,u),c=fe(a,a),s=a[0],l=c-s*s;if(!l)return!e&amp;&amp;n;var f=i*c/l,h=-i*s/l,g=he(o,a),p=pe(o,f),v=pe(a,h);ge(p,v);var d=g,m=fe(p,d),y=fe(d,d),x=m*m-y*(fe(p,p)-1);if(!(0&gt;x)){var M=Math
 .sqrt(x),_=pe(d,(-m-M)/y);if(ge(_,p),_=de(_),!e)return _;var b,w=n[0],S=t[0],k=n[1],E=t[1];w&gt;S&amp;&amp;(b=w,w=S,S=b);var A=S-w,C=ua(A-ba)&lt;ka,N=C||ka&gt;A;if(!C&amp;&amp;k&gt;E&amp;&amp;(b=k,k=E,E=b),N?C?k+E&gt;0^_[1]&lt;(ua(_[0]-w)&lt;ka?k:E):k&lt;=_[1]&amp;&amp;_[1]&lt;=E:A&gt;ba^(w&lt;=_[0]&amp;&amp;_[0]&lt;=S)){var z=pe(d,(-m+M)/y);return ge(z,p),[_,de(z)]}}}function u(t,e){var r=o?n:ba-n,u=0;return-r&gt;t?u|=1:t&gt;r&amp;&amp;(u|=2),-r&gt;e?u|=4:e&gt;r&amp;&amp;(u|=8),u}var i=Math.cos(n),o=i&gt;0,a=ua(i)&gt;ka,c=sr(n,6*Aa);return Ae(t,e,c,o?[0,-n]:[-ba,n-ba])}function Pe(n,t,e,r){return function(u){var i,o=u.a,a=u.b,c=o.x,s=o.y,l=a.x,f=a.y,h=0,g=1,p=l-c,v=f-s;if(i=n-c,p||!(i&gt;0)){if(i/=p,0&gt;p){if(h&gt;i)return;g&gt;i&amp;&amp;(g=i)}else if(p&gt;0){if(i&gt;g)return;i&gt;h&amp;&amp;(h=i)}if(i=e-c,p||!(0&gt;i)){if(i/=p,0&gt;p){if(i&gt;g)return;i&gt;h&amp;&amp;(h=i)}else if(p&gt;0){if(h&gt;i)return;g&gt;i&amp;&amp;(g=i)}if(i=t-s,v||!(i&gt;0)){if(i/=v,0&gt;v){if(h&
 gt;i)return;g&gt;i&amp;&amp;(g=i)}else if(v&gt;0){if(i&gt;g)return;i&gt;h&amp;&amp;(h=i)}if(i=r-s,v||!(0&gt;i)){if(i/=v,0&gt;v){if(i&gt;g)return;i&gt;h&amp;&amp;(h=i)}else if(v&gt;0){if(h&gt;i)return;g&gt;i&amp;&amp;(g=i)}return h&gt;0&amp;&amp;(u.a={x:c+h*p,y:s+h*v}),1&gt;g&amp;&amp;(u.b={x:c+g*p,y:s+g*v}),u}}}}}}function Ue(n,t,e,r){function u(r,u){return ua(r[0]-n)&lt;ka?u&gt;0?0:3:ua(r[0]-e)&lt;ka?u&gt;0?2:1:ua(r[1]-t)&lt;ka?u&gt;0?1:0:u&gt;0?3:2}function i(n,t){return o(n.x,t.x)}function o(n,t){var e=u(n,1),r=u(t,1);return e!==r?e-r:0===e?t[1]-n[1]:1===e?n[0]-t[0]:2===e?n[1]-t[1]:t[0]-n[0]}return function(a){function c(n){for(var t=0,e=d.length,r=n[1],u=0;e&gt;u;++u)for(var i,o=1,a=d[u],c=a.length,s=a[0];c&gt;o;++o)i=a[o],s[1]&lt;=r?i[1]&gt;r&amp;&amp;W(s,i,n)&gt;0&amp;&amp;++t:i[1]&lt;=r&amp;&amp;W(s,i,n)&lt;0&amp;&amp;--t,s=i;return 0!==t}function s(i,a,c,s){var l=0,f=0;if(null==i||(l=u(i,c))!==(f=u(a,c))||o(i,a)&lt;0^c&gt;0){do s.point(0===l||3===l?n:e,l&gt;1?r:t);wh
 ile((l=(l+c+4)%4)!==f)}else s.point(a[0],a[1])}function l(u,i){return u&gt;=n&amp;&amp;e&gt;=u&amp;&amp;i&gt;=t&amp;&amp;r&gt;=i}function f(n,t){l(n,t)&amp;&amp;a.point(n,t)}function h(){N.point=p,d&amp;&amp;d.push(m=[]),S=!0,w=!1,_=b=0/0}function g(){v&amp;&amp;(p(y,x),M&amp;&amp;w&amp;&amp;A.rejoin(),v.push(A.buffer())),N.point=f,w&amp;&amp;a.lineEnd()}function p(n,t){n=Math.max(-kc,Math.min(kc,n)),t=Math.max(-kc,Math.min(kc,t));var e=l(n,t);if(d&amp;&amp;m.push([n,t]),S)y=n,x=t,M=e,S=!1,e&amp;&amp;(a.lineStart(),a.point(n,t));else if(e&amp;&amp;w)a.point(n,t);else{var r={a:{x:_,y:b},b:{x:n,y:t}};C(r)?(w||(a.lineStart(),a.point(r.a.x,r.a.y)),a.point(r.b.x,r.b.y),e||a.lineEnd(),k=!1):e&amp;&amp;(a.lineStart(),a.point(n,t),k=!1)}_=n,b=t,w=e}var v,d,m,y,x,M,_,b,w,S,k,E=a,A=Ne(),C=Pe(n,t,e,r),N={point:f,lineStart:h,lineEnd:g,polygonStart:function(){a=A,v=[],d=[],k=!0},polygonEnd:function(){a=E,v=Zo.merge(v);var t=c([n,r]),e=k&amp;&amp;t,u=v.length;(e||u)&amp;&amp;(a.polygonSta
 rt(),e&amp;&amp;(a.lineStart(),s(null,null,1,a),a.lineEnd()),u&amp;&amp;Se(v,i,t,s,a),a.polygonEnd()),v=d=m=null}};return N}}function je(n,t){function e(e,r){return e=n(e,r),t(e[0],e[1])}return n.invert&amp;&amp;t.invert&amp;&amp;(e.invert=function(e,r){return e=t.invert(e,r),e&amp;&amp;n.invert(e[0],e[1])}),e}function He(n){var t=0,e=ba/3,r=tr(n),u=r(t,e);return u.parallels=function(n){return arguments.length?r(t=n[0]*ba/180,e=n[1]*ba/180):[180*(t/ba),180*(e/ba)]},u}function Fe(n,t){function e(n,t){var e=Math.sqrt(i-2*u*Math.sin(t))/u;return[e*Math.sin(n*=u),o-e*Math.cos(n)]}var r=Math.sin(n),u=(r+Math.sin(t))/2,i=1+r*(2*u-r),o=Math.sqrt(i)/u;return e.invert=function(n,t){var e=o-t;return[Math.atan2(n,e)/u,G((i-(n*n+e*e)*u*u)/(2*u))]},e}function Oe(){function n(n,t){Ac+=u*n-r*t,r=n,u=t}var t,e,r,u;Tc.point=function(i,o){Tc.point=n,t=r=i,e=u=o},Tc.lineEnd=function(){n(t,e)}}function Ye(n,t){Cc&gt;n&amp;&amp;(Cc=n),n&gt;zc&amp;&amp;(zc=n),Nc&gt;t&amp;&amp;(Nc=t),t&gt;Lc&amp;&
 amp;(Lc=t)}function Ie(){function n(n,t){o.push(&quot;M&quot;,n,&quot;,&quot;,t,i)}function t(n,t){o.push(&quot;M&quot;,n,&quot;,&quot;,t),a.point=e}function e(n,t){o.push(&quot;L&quot;,n,&quot;,&quot;,t)}function r(){a.point=n}function u(){o.push(&quot;Z&quot;)}var i=Ze(4.5),o=[],a={point:n,lineStart:function(){a.point=t},lineEnd:r,polygonStart:function(){a.lineEnd=u},polygonEnd:function(){a.lineEnd=r,a.point=n},pointRadius:function(n){return i=Ze(n),a},result:function(){if(o.length){var n=o.join(&quot;&quot;);return o=[],n}}};return a}function Ze(n){return&quot;m0,&quot;+n+&quot;a&quot;+n+&quot;,&quot;+n+&quot; 0 1,1 0,&quot;+-2*n+&quot;a&quot;+n+&quot;,&quot;+n+&quot; 0 1,1 0,&quot;+2*n+&quot;z&quot;}function Ve(n,t){pc+=n,vc+=t,++dc}function Xe(){function n(n,r){var u=n-t,i=r-e,o=Math.sqrt(u*u+i*i);mc+=o*(t+n)/2,yc+=o*(e+r)/2,xc+=o,Ve(t=n,e=r)}var t,e;Rc.point=function(r,u){Rc.point=n,Ve(t=r,e=u)}}function $e(){Rc.point=Ve}function Be(){function n(n,t){var e=n-r,i=t-u,o=
 Math.sqrt(e*e+i*i);mc+=o*(r+n)/2,yc+=o*(u+t)/2,xc+=o,o=u*n-r*t,Mc+=o*(r+n),_c+=o*(u+t),bc+=3*o,Ve(r=n,u=t)}var t,e,r,u;Rc.point=function(i,o){Rc.point=n,Ve(t=r=i,e=u=o)},Rc.lineEnd=function(){n(t,e)}}function We(n){function t(t,e){n.moveTo(t,e),n.arc(t,e,o,0,wa)}function e(t,e){n.moveTo(t,e),a.point=r}function r(t,e){n.lineTo(t,e)}function u(){a.point=t}function i(){n.closePath()}var o=4.5,a={point:t,lineStart:function(){a.point=e},lineEnd:u,polygonStart:function(){a.lineEnd=i},polygonEnd:function(){a.lineEnd=u,a.point=t},pointRadius:function(n){return o=n,a},result:v};return a}function Je(n){function t(n){return(a?r:e)(n)}function e(t){return Qe(t,function(e,r){e=n(e,r),t.point(e[0],e[1])})}function r(t){function e(e,r){e=n(e,r),t.point(e[0],e[1])}function r(){x=0/0,S.point=i,t.lineStart()}function i(e,r){var i=le([e,r]),o=n(e,r);u(x,M,y,_,b,w,x=o[0],M=o[1],y=e,_=i[0],b=i[1],w=i[2],a,t),t.point(x,M)}function o(){S.point=e,t.lineEnd()}function c(){r(),S.point=s,S.lineEnd=l}f
 unction s(n,t){i(f=n,h=t),g=x,p=M,v=_,d=b,m=w,S.point=i}function l(){u(x,M,y,_,b,w,g,p,f,v,d,m,a,t),S.lineEnd=o,o()}var f,h,g,p,v,d,m,y,x,M,_,b,w,S={point:e,lineStart:r,lineEnd:o,polygonStart:function(){t.polygonStart(),S.lineStart=c},polygonEnd:function(){t.polygonEnd(),S.lineStart=r}};return S}function u(t,e,r,a,c,s,l,f,h,g,p,v,d,m){var y=l-t,x=f-e,M=y*y+x*x;if(M&gt;4*i&amp;&amp;d--){var _=a+g,b=c+p,w=s+v,S=Math.sqrt(_*_+b*b+w*w),k=Math.asin(w/=S),E=ua(ua(w)-1)&lt;ka||ua(r-h)&lt;ka?(r+h)/2:Math.atan2(b,_),A=n(E,k),C=A[0],N=A[1],z=C-t,L=N-e,T=x*z-y*L;(T*T/M&gt;i||ua((y*z+x*L)/M-.5)&gt;.3||o&gt;a*g+c*p+s*v)&amp;&amp;(u(t,e,r,a,c,s,C,N,E,_/=S,b/=S,w,d,m),m.point(C,N),u(C,N,E,_,b,w,l,f,h,g,p,v,d,m))}}var i=.5,o=Math.cos(30*Aa),a=16;
+return t.precision=function(n){return arguments.length?(a=(i=n*n)&gt;0&amp;&amp;16,t):Math.sqrt(i)},t}function Ge(n){var t=Je(function(t,e){return n([t*Ca,e*Ca])});return function(n){return er(t(n))}}function Ke(n){this.stream=n}function Qe(n,t){return{point:t,sphere:function(){n.sphere()},lineStart:function(){n.lineStart()},lineEnd:function(){n.lineEnd()},polygonStart:function(){n.polygonStart()},polygonEnd:function(){n.polygonEnd()}}}function nr(n){return tr(function(){return n})()}function tr(n){function t(n){return n=a(n[0]*Aa,n[1]*Aa),[n[0]*h+c,s-n[1]*h]}function e(n){return n=a.invert((n[0]-c)/h,(s-n[1])/h),n&amp;&amp;[n[0]*Ca,n[1]*Ca]}function r(){a=je(o=ir(m,y,x),i);var n=i(v,d);return c=g-n[0]*h,s=p+n[1]*h,u()}function u(){return l&amp;&amp;(l.valid=!1,l=null),t}var i,o,a,c,s,l,f=Je(function(n,t){return n=i(n,t),[n[0]*h+c,s-n[1]*h]}),h=150,g=480,p=250,v=0,d=0,m=0,y=0,x=0,M=Sc,_=wt,b=null,w=null;return t.stream=function(n){return l&amp;&amp;(l.valid=!1),l=er(M(o,f(_(
 n)))),l.valid=!0,l},t.clipAngle=function(n){return arguments.length?(M=null==n?(b=n,Sc):De((b=+n)*Aa),u()):b},t.clipExtent=function(n){return arguments.length?(w=n,_=n?Ue(n[0][0],n[0][1],n[1][0],n[1][1]):wt,u()):w},t.scale=function(n){return arguments.length?(h=+n,r()):h},t.translate=function(n){return arguments.length?(g=+n[0],p=+n[1],r()):[g,p]},t.center=function(n){return arguments.length?(v=n[0]%360*Aa,d=n[1]%360*Aa,r()):[v*Ca,d*Ca]},t.rotate=function(n){return arguments.length?(m=n[0]%360*Aa,y=n[1]%360*Aa,x=n.length&gt;2?n[2]%360*Aa:0,r()):[m*Ca,y*Ca,x*Ca]},Zo.rebind(t,f,&quot;precision&quot;),function(){return i=n.apply(this,arguments),t.invert=i.invert&amp;&amp;e,r()}}function er(n){return Qe(n,function(t,e){n.point(t*Aa,e*Aa)})}function rr(n,t){return[n,t]}function ur(n,t){return[n&gt;ba?n-wa:-ba&gt;n?n+wa:n,t]}function ir(n,t,e){return n?t||e?je(ar(n),cr(t,e)):ar(n):t||e?cr(t,e):ur}function or(n){return function(t,e){return t+=n,[t&gt;ba?t-wa:-ba&gt;t?t+wa:t,e]}}fun
 ction ar(n){var t=or(n);return t.invert=or(-n),t}function cr(n,t){function e(n,t){var e=Math.cos(t),a=Math.cos(n)*e,c=Math.sin(n)*e,s=Math.sin(t),l=s*r+a*u;return[Math.atan2(c*i-l*o,a*r-s*u),G(l*i+c*o)]}var r=Math.cos(n),u=Math.sin(n),i=Math.cos(t),o=Math.sin(t);return e.invert=function(n,t){var e=Math.cos(t),a=Math.cos(n)*e,c=Math.sin(n)*e,s=Math.sin(t),l=s*i-c*o;return[Math.atan2(c*i+s*o,a*r+l*u),G(l*r-a*u)]},e}function sr(n,t){var e=Math.cos(n),r=Math.sin(n);return function(u,i,o,a){var c=o*t;null!=u?(u=lr(e,u),i=lr(e,i),(o&gt;0?i&gt;u:u&gt;i)&amp;&amp;(u+=o*wa)):(u=n+o*wa,i=n-.5*c);for(var s,l=u;o&gt;0?l&gt;i:i&gt;l;l-=c)a.point((s=de([e,-r*Math.cos(l),-r*Math.sin(l)]))[0],s[1])}}function lr(n,t){var e=le(t);e[0]-=n,ve(e);var r=J(-e[1]);return((-e[2]&lt;0?-r:r)+2*Math.PI-ka)%(2*Math.PI)}function fr(n,t,e){var r=Zo.range(n,t-ka,e).concat(t);return function(n){return r.map(function(t){return[n,t]})}}function hr(n,t,e){var r=Zo.range(n,t-ka,e).concat(t);return function(n){r
 eturn r.map(function(t){return[t,n]})}}function gr(n){return n.source}function pr(n){return n.target}function vr(n,t,e,r){var u=Math.cos(t),i=Math.sin(t),o=Math.cos(r),a=Math.sin(r),c=u*Math.cos(n),s=u*Math.sin(n),l=o*Math.cos(e),f=o*Math.sin(e),h=2*Math.asin(Math.sqrt(tt(r-t)+u*o*tt(e-n))),g=1/Math.sin(h),p=h?function(n){var t=Math.sin(n*=h)*g,e=Math.sin(h-n)*g,r=e*c+t*l,u=e*s+t*f,o=e*i+t*a;return[Math.atan2(u,r)*Ca,Math.atan2(o,Math.sqrt(r*r+u*u))*Ca]}:function(){return[n*Ca,t*Ca]};return p.distance=h,p}function dr(){function n(n,u){var i=Math.sin(u*=Aa),o=Math.cos(u),a=ua((n*=Aa)-t),c=Math.cos(a);Dc+=Math.atan2(Math.sqrt((a=o*Math.sin(a))*a+(a=r*i-e*o*c)*a),e*i+r*o*c),t=n,e=i,r=o}var t,e,r;Pc.point=function(u,i){t=u*Aa,e=Math.sin(i*=Aa),r=Math.cos(i),Pc.point=n},Pc.lineEnd=function(){Pc.point=Pc.lineEnd=v}}function mr(n,t){function e(t,e){var r=Math.cos(t),u=Math.cos(e),i=n(r*u);return[i*u*Math.sin(t),i*Math.sin(e)]}return e.invert=function(n,e){var r=Math.sqrt(n*n+e*e),u
 =t(r),i=Math.sin(u),o=Math.cos(u);return[Math.atan2(n*i,r*o),Math.asin(r&amp;&amp;e*i/r)]},e}function yr(n,t){function e(n,t){o&gt;0?-Sa+ka&gt;t&amp;&amp;(t=-Sa+ka):t&gt;Sa-ka&amp;&amp;(t=Sa-ka);var e=o/Math.pow(u(t),i);return[e*Math.sin(i*n),o-e*Math.cos(i*n)]}var r=Math.cos(n),u=function(n){return Math.tan(ba/4+n/2)},i=n===t?Math.sin(n):Math.log(r/Math.cos(t))/Math.log(u(t)/u(n)),o=r*Math.pow(u(n),i)/i;return i?(e.invert=function(n,t){var e=o-t,r=B(i)*Math.sqrt(n*n+e*e);return[Math.atan2(n,e)/i,2*Math.atan(Math.pow(o/r,1/i))-Sa]},e):Mr}function xr(n,t){function e(n,t){var e=i-t;return[e*Math.sin(u*n),i-e*Math.cos(u*n)]}var r=Math.cos(n),u=n===t?Math.sin(n):(r-Math.cos(t))/(t-n),i=r/u+n;return ua(u)&lt;ka?rr:(e.invert=function(n,t){var e=i-t;return[Math.atan2(n,e)/u,i-B(u)*Math.sqrt(n*n+e*e)]},e)}function Mr(n,t){return[n,Math.log(Math.tan(ba/4+t/2))]}function _r(n){var t,e=nr(n),r=e.scale,u=e.translate,i=e.clipExtent;return e.scale=function(){var n=r.apply(e,arguments);ret
 urn n===e?t?e.clipExtent(null):e:n},e.translate=function(){var n=u.apply(e,arguments);return n===e?t?e.clipExtent(null):e:n},e.clipExtent=function(n){var o=i.apply(e,arguments);if(o===e){if(t=null==n){var a=ba*r(),c=u();i([[c[0]-a,c[1]-a],[c[0]+a,c[1]+a]])}}else t&amp;&amp;(o=null);return o},e.clipExtent(null)}function br(n,t){return[Math.log(Math.tan(ba/4+t/2)),-n]}function wr(n){return n[0]}function Sr(n){return n[1]}function kr(n){for(var t=n.length,e=[0,1],r=2,u=2;t&gt;u;u++){for(;r&gt;1&amp;&amp;W(n[e[r-2]],n[e[r-1]],n[u])&lt;=0;)--r;e[r++]=u}return e.slice(0,r)}function Er(n,t){return n[0]-t[0]||n[1]-t[1]}function Ar(n,t,e){return(e[0]-t[0])*(n[1]-t[1])&lt;(e[1]-t[1])*(n[0]-t[0])}function Cr(n,t,e,r){var u=n[0],i=e[0],o=t[0]-u,a=r[0]-i,c=n[1],s=e[1],l=t[1]-c,f=r[1]-s,h=(a*(c-s)-f*(u-i))/(f*o-a*l);return[u+h*o,c+h*l]}function Nr(n){var t=n[0],e=n[n.length-1];return!(t[0]-e[0]||t[1]-e[1])}function zr(){Gr(this),this.edge=this.site=this.circle=null}function Lr(n){var t=Bc
 .pop()||new zr;return t.site=n,t}function Tr(n){Yr(n),Vc.remove(n),Bc.push(n),Gr(n)}function qr(n){var t=n.circle,e=t.x,r=t.cy,u={x:e,y:r},i=n.P,o=n.N,a=[n];Tr(n);for(var c=i;c.circle&amp;&amp;ua(e-c.circle.x)&lt;ka&amp;&amp;ua(r-c.circle.cy)&lt;ka;)i=c.P,a.unshift(c),Tr(c),c=i;a.unshift(c),Yr(c);for(var s=o;s.circle&amp;&amp;ua(e-s.circle.x)&lt;ka&amp;&amp;ua(r-s.circle.cy)&lt;ka;)o=s.N,a.push(s),Tr(s),s=o;a.push(s),Yr(s);var l,f=a.length;for(l=1;f&gt;l;++l)s=a[l],c=a[l-1],Br(s.edge,c.site,s.site,u);c=a[0],s=a[f-1],s.edge=Xr(c.site,s.site,null,u),Or(c),Or(s)}function Rr(n){for(var t,e,r,u,i=n.x,o=n.y,a=Vc._;a;)if(r=Dr(a,o)-i,r&gt;ka)a=a.L;else{if(u=i-Pr(a,o),!(u&gt;ka)){r&gt;-ka?(t=a.P,e=a):u&gt;-ka?(t=a,e=a.N):t=e=a;break}if(!a.R){t=a;break}a=a.R}var c=Lr(n);if(Vc.insert(t,c),t||e){if(t===e)return Yr(t),e=Lr(t.site),Vc.insert(c,e),c.edge=e.edge=Xr(t.site,c.site),Or(t),Or(e),void 0;if(!e)return c.edge=Xr(t.site,c.site),void 0;Yr(t),Yr(e);var s=t.site,l=s.x,f=s.y,h=n.x-l,g=n
 .y-f,p=e.site,v=p.x-l,d=p.y-f,m=2*(h*d-g*v),y=h*h+g*g,x=v*v+d*d,M={x:(d*y-g*x)/m+l,y:(h*x-v*y)/m+f};Br(e.edge,s,p,M),c.edge=Xr(s,n,null,M),e.edge=Xr(n,p,null,M),Or(t),Or(e)}}function Dr(n,t){var e=n.site,r=e.x,u=e.y,i=u-t;if(!i)return r;var o=n.P;if(!o)return-1/0;e=o.site;var a=e.x,c=e.y,s=c-t;if(!s)return a;var l=a-r,f=1/i-1/s,h=l/s;return f?(-h+Math.sqrt(h*h-2*f*(l*l/(-2*s)-c+s/2+u-i/2)))/f+r:(r+a)/2}function Pr(n,t){var e=n.N;if(e)return Dr(e,t);var r=n.site;return r.y===t?r.x:1/0}function Ur(n){this.site=n,this.edges=[]}function jr(n){for(var t,e,r,u,i,o,a,c,s,l,f=n[0][0],h=n[1][0],g=n[0][1],p=n[1][1],v=Zc,d=v.length;d--;)if(i=v[d],i&amp;&amp;i.prepare())for(a=i.edges,c=a.length,o=0;c&gt;o;)l=a[o].end(),r=l.x,u=l.y,s=a[++o%c].start(),t=s.x,e=s.y,(ua(r-t)&gt;ka||ua(u-e)&gt;ka)&amp;&amp;(a.splice(o,0,new Wr($r(i.site,l,ua(r-f)&lt;ka&amp;&amp;p-u&gt;ka?{x:f,y:ua(t-f)&lt;ka?e:p}:ua(u-p)&lt;ka&amp;&amp;h-r&gt;ka?{x:ua(e-p)&lt;ka?t:h,y:p}:ua(r-h)&lt;ka&amp;&amp;u-g&gt;ka?{x:h,
 y:ua(t-h)&lt;ka?e:g}:ua(u-g)&lt;ka&amp;&amp;r-f&gt;ka?{x:ua(e-g)&lt;ka?t:f,y:g}:null),i.site,null)),++c)}function Hr(n,t){return t.angle-n.angle}function Fr(){Gr(this),this.x=this.y=this.arc=this.site=this.cy=null}function Or(n){var t=n.P,e=n.N;if(t&amp;&amp;e){var r=t.site,u=n.site,i=e.site;if(r!==i){var o=u.x,a=u.y,c=r.x-o,s=r.y-a,l=i.x-o,f=i.y-a,h=2*(c*f-s*l);if(!(h&gt;=-Ea)){var g=c*c+s*s,p=l*l+f*f,v=(f*g-s*p)/h,d=(c*p-l*g)/h,f=d+a,m=Wc.pop()||new Fr;m.arc=n,m.site=u,m.x=v+o,m.y=f+Math.sqrt(v*v+d*d),m.cy=f,n.circle=m;for(var y=null,x=$c._;x;)if(m.y&lt;x.y||m.y===x.y&amp;&amp;m.x&lt;=x.x){if(!x.L){y=x.P;break}x=x.L}else{if(!x.R){y=x;break}x=x.R}$c.insert(y,m),y||(Xc=m)}}}}function Yr(n){var t=n.circle;t&amp;&amp;(t.P||(Xc=t.N),$c.remove(t),Wc.push(t),Gr(t),n.circle=null)}function Ir(n){for(var t,e=Ic,r=Pe(n[0][0],n[0][1],n[1][0],n[1][1]),u=e.length;u--;)t=e[u],(!Zr(t,n)||!r(t)||ua(t.a.x-t.b.x)&lt;ka&amp;&amp;ua(t.a.y-t.b.y)&lt;ka)&amp;&amp;(t.a=t.b=null,e.splice(u,1))}fun
 ction Zr(n,t){var e=n.b;if(e)return!0;var r,u,i=n.a,o=t[0][0],a=t[1][0],c=t[0][1],s=t[1][1],l=n.l,f=n.r,h=l.x,g=l.y,p=f.x,v=f.y,d=(h+p)/2,m=(g+v)/2;if(v===g){if(o&gt;d||d&gt;=a)return;if(h&gt;p){if(i){if(i.y&gt;=s)return}else i={x:d,y:c};e={x:d,y:s}}else{if(i){if(i.y&lt;c)return}else i={x:d,y:s};e={x:d,y:c}}}else if(r=(h-p)/(v-g),u=m-r*d,-1&gt;r||r&gt;1)if(h&gt;p){if(i){if(i.y&gt;=s)return}else i={x:(c-u)/r,y:c};e={x:(s-u)/r,y:s}}else{if(i){if(i.y&lt;c)return}else i={x:(s-u)/r,y:s};e={x:(c-u)/r,y:c}}else if(v&gt;g){if(i){if(i.x&gt;=a)return}else i={x:o,y:r*o+u};e={x:a,y:r*a+u}}else{if(i){if(i.x&lt;o)return}else i={x:a,y:r*a+u};e={x:o,y:r*o+u}}return n.a=i,n.b=e,!0}function Vr(n,t){this.l=n,this.r=t,this.a=this.b=null}function Xr(n,t,e,r){var u=new Vr(n,t);return Ic.push(u),e&amp;&amp;Br(u,n,t,e),r&amp;&amp;Br(u,t,n,r),Zc[n.i].edges.push(new Wr(u,n,t)),Zc[t.i].edges.push(new Wr(u,t,n)),u}function $r(n,t,e){var r=new Vr(n,null);return r.a=t,r.b=e,Ic.push(r),r}function Br(n,t,e
 ,r){n.a||n.b?n.l===e?n.b=r:n.a=r:(n.a=r,n.l=t,n.r=e)}function Wr(n,t,e){var r=n.a,u=n.b;this.edge=n,this.site=t,this.angle=e?Math.atan2(e.y-t.y,e.x-t.x):n.l===t?Math.atan2(u.x-r.x,r.y-u.y):Math.atan2(r.x-u.x,u.y-r.y)}function Jr(){this._=null}function Gr(n){n.U=n.C=n.L=n.R=n.P=n.N=null}function Kr(n,t){var e=t,r=t.R,u=e.U;u?u.L===e?u.L=r:u.R=r:n._=r,r.U=u,e.U=r,e.R=r.L,e.R&amp;&amp;(e.R.U=e),r.L=e}function Qr(n,t){var e=t,r=t.L,u=e.U;u?u.L===e?u.L=r:u.R=r:n._=r,r.U=u,e.U=r,e.L=r.R,e.L&amp;&amp;(e.L.U=e),r.R=e}function nu(n){for(;n.L;)n=n.L;return n}function tu(n,t){var e,r,u,i=n.sort(eu).pop();for(Ic=[],Zc=new Array(n.length),Vc=new Jr,$c=new Jr;;)if(u=Xc,i&amp;&amp;(!u||i.y&lt;u.y||i.y===u.y&amp;&amp;i.x&lt;u.x))(i.x!==e||i.y!==r)&amp;&amp;(Zc[i.i]=new Ur(i),Rr(i),e=i.x,r=i.y),i=n.pop();else{if(!u)break;qr(u.arc)}t&amp;&amp;(Ir(t),jr(t));var o={cells:Zc,edges:Ic};return Vc=$c=Ic=Zc=null,o}function eu(n,t){return t.y-n.y||t.x-n.x}function ru(n,t,e){return(n.x-e.x)*(t.y-n.y)-
 (n.x-t.x)*(e.y-n.y)}function uu(n){return n.x}function iu(n){return n.y}function ou(){return{leaf:!0,nodes:[],point:null,x:null,y:null}}function au(n,t,e,r,u,i){if(!n(t,e,r,u,i)){var o=.5*(e+u),a=.5*(r+i),c=t.nodes;c[0]&amp;&amp;au(n,c[0],e,r,o,a),c[1]&amp;&amp;au(n,c[1],o,r,u,a),c[2]&amp;&amp;au(n,c[2],e,a,o,i),c[3]&amp;&amp;au(n,c[3],o,a,u,i)}}function cu(n,t){n=Zo.rgb(n),t=Zo.rgb(t);var e=n.r,r=n.g,u=n.b,i=t.r-e,o=t.g-r,a=t.b-u;return function(n){return&quot;#&quot;+dt(Math.round(e+i*n))+dt(Math.round(r+o*n))+dt(Math.round(u+a*n))}}function su(n,t){var e,r={},u={};for(e in n)e in t?r[e]=hu(n[e],t[e]):u[e]=n[e];for(e in t)e in n||(u[e]=t[e]);return function(n){for(e in r)u[e]=r[e](n);return u}}function lu(n,t){return t-=n=+n,function(e){return n+t*e}}function fu(n,t){var e,r,u,i=Gc.lastIndex=Kc.lastIndex=0,o=-1,a=[],c=[];for(n+=&quot;&quot;,t+=&quot;&quot;;(e=Gc.exec(n))&amp;&amp;(r=Kc.exec(t));)(u=r.index)&gt;i&amp;&amp;(u=t.substring(i,u),a[o]?a[o]+=u:a[++o]=u),(e=e[0])=
 ==(r=r[0])?a[o]?a[o]+=r:a[++o]=r:(a[++o]=null,c.push({i:o,x:lu(e,r)})),i=Kc.lastIndex;return i&lt;t.length&amp;&amp;(u=t.substring(i),a[o]?a[o]+=u:a[++o]=u),a.length&lt;2?c[0]?(t=c[0].x,function(n){return t(n)+&quot;&quot;}):function(){return t}:(t=c.length,function(n){for(var e,r=0;t&gt;r;++r)a[(e=c[r]).i]=e.x(n);return a.join(&quot;&quot;)})}function hu(n,t){for(var e,r=Zo.interpolators.length;--r&gt;=0&amp;&amp;!(e=Zo.interpolators[r](n,t)););return e}function gu(n,t){var e,r=[],u=[],i=n.length,o=t.length,a=Math.min(n.length,t.length);for(e=0;a&gt;e;++e)r.push(hu(n[e],t[e]));for(;i&gt;e;++e)u[e]=n[e];for(;o&gt;e;++e)u[e]=t[e];return function(n){for(e=0;a&gt;e;++e)u[e]=r[e](n);return u}}function pu(n){return function(t){return 0&gt;=t?0:t&gt;=1?1:n(t)}}function vu(n){return function(t){return 1-n(1-t)}}function du(n){return function(t){return.5*(.5&gt;t?n(2*t):2-n(2-2*t))}}function mu(n){return n*n}function yu(n){return n*n*n}function xu(n){if(0&gt;=n)return 0;if(n&gt;=1)r
 eturn 1;var t=n*n,e=t*n;return 4*(.5&gt;n?e:3*(n-t)+e-.75)}function Mu(n){return function(t){return Math.pow(t,n)}}function _u(n){return 1-Math.cos(n*Sa)}function bu(n){return Math.pow(2,10*(n-1))}function wu(n){return 1-Math.sqrt(1-n*n)}function Su(n,t){var e;return arguments.length&lt;2&amp;&amp;(t=.45),arguments.length?e=t/wa*Math.asin(1/n):(n=1,e=t/4),function(r){return 1+n*Math.pow(2,-10*r)*Math.sin((r-e)*wa/t)}}function ku(n){return n||(n=1.70158),function(t){return t*t*((n+1)*t-n)}}function Eu(n){return 1/2.75&gt;n?7.5625*n*n:2/2.75&gt;n?7.5625*(n-=1.5/2.75)*n+.75:2.5/2.75&gt;n?7.5625*(n-=2.25/2.75)*n+.9375:7.5625*(n-=2.625/2.75)*n+.984375}function Au(n,t){n=Zo.hcl(n),t=Zo.hcl(t);var e=n.h,r=n.c,u=n.l,i=t.h-e,o=t.c-r,a=t.l-u;return isNaN(o)&amp;&amp;(o=0,r=isNaN(r)?t.c:r),isNaN(i)?(i=0,e=isNaN(e)?t.h:e):i&gt;180?i-=360:-180&gt;i&amp;&amp;(i+=360),function(n){return ot(e+i*n,r+o*n,u+a*n)+&quot;&quot;}}function Cu(n,t){n=Zo.hsl(n),t=Zo.hsl(t);var e=n.h,r=n.s,u=n.l,i=t.h
 -e,o=t.s-r,a=t.l-u;return isNaN(o)&amp;&amp;(o=0,r=isNaN(r)?t.s:r),isNaN(i)?(i=0,e=isNaN(e)?t.h:e):i&gt;180?i-=360:-180&gt;i&amp;&amp;(i+=360),function(n){return ut(e+i*n,r+o*n,u+a*n)+&quot;&quot;}}function Nu(n,t){n=Zo.lab(n),t=Zo.lab(t);var e=n.l,r=n.a,u=n.b,i=t.l-e,o=t.a-r,a=t.b-u;return function(n){return ct(e+i*n,r+o*n,u+a*n)+&quot;&quot;}}function zu(n,t){return t-=n,function(e){return Math.round(n+t*e)}}function Lu(n){var t=[n.a,n.b],e=[n.c,n.d],r=qu(t),u=Tu(t,e),i=qu(Ru(e,t,-u))||0;t[0]*e[1]&lt;e[0]*t[1]&amp;&amp;(t[0]*=-1,t[1]*=-1,r*=-1,u*=-1),this.rotate=(r?Math.atan2(t[1],t[0]):Math.atan2(-e[0],e[1]))*Ca,this.translate=[n.e,n.f],this.scale=[r,i],this.skew=i?Math.atan2(u,i)*Ca:0}function Tu(n,t){return n[0]*t[0]+n[1]*t[1]}function qu(n){var t=Math.sqrt(Tu(n,n));return t&amp;&amp;(n[0]/=t,n[1]/=t),t}function Ru(n,t,e){return n[0]+=e*t[0],n[1]+=e*t[1],n}function Du(n,t){var e,r=[],u=[],i=Zo.transform(n),o=Zo.transform(t),a=i.translate,c=o.translate,s=i.rotate,l=o.rot
 ate,f=i.skew,h=o.skew,g=i.scale,p=o.scale;return a[0]!=c[0]||a[1]!=c[1]?(r.push(&quot;translate(&quot;,null,&quot;,&quot;,null,&quot;)&quot;),u.push({i:1,x:lu(a[0],c[0])},{i:3,x:lu(a[1],c[1])})):c[0]||c[1]?r.push(&quot;translate(&quot;+c+&quot;)&quot;):r.push(&quot;&quot;),s!=l?(s-l&gt;180?l+=360:l-s&gt;180&amp;&amp;(s+=360),u.push({i:r.push(r.pop()+&quot;rotate(&quot;,null,&quot;)&quot;)-2,x:lu(s,l)})):l&amp;&amp;r.push(r.pop()+&quot;rotate(&quot;+l+&quot;)&quot;),f!=h?u.push({i:r.push(r.pop()+&quot;skewX(&quot;,null,&quot;)&quot;)-2,x:lu(f,h)}):h&amp;&amp;r.push(r.pop()+&quot;skewX(&quot;+h+&quot;)&quot;),g[0]!=p[0]||g[1]!=p[1]?(e=r.push(r.pop()+&quot;scale(&quot;,null,&quot;,&quot;,null,&quot;)&quot;),u.push({i:e-4,x:lu(g[0],p[0])},{i:e-2,x:lu(g[1],p[1])})):(1!=p[0]||1!=p[1])&amp;&amp;r.push(r.pop()+&quot;scale(&quot;+p+&quot;)&quot;),e=u.length,function(n){for(var t,i=-1;++i&lt;e;)r[(t=u[i]).i]=t.x(n);return r.join(&quot;&quot;)}}function Pu(n,t){return t=t-(n=+n)?1/(t-n
 ):0,function(e){return(e-n)*t}}function Uu(n,t){return t=t-(n=+n)?1/(t-n):0,function(e){return Math.max(0,Math.min(1,(e-n)*t))}}function ju(n){for(var t=n.source,e=n.target,r=Fu(t,e),u=[t];t!==r;)t=t.parent,u.push(t);for(var i=u.length;e!==r;)u.splice(i,0,e),e=e.parent;return u}function Hu(n){for(var t=[],e=n.parent;null!=e;)t.push(n),n=e,e=e.parent;return t.push(n),t}function Fu(n,t){if(n===t)return n;for(var e=Hu(n),r=Hu(t),u=e.pop(),i=r.pop(),o=null;u===i;)o=u,u=e.pop(),i=r.pop();return o}function Ou(n){n.fixed|=2}function Yu(n){n.fixed&amp;=-7}function Iu(n){n.fixed|=4,n.px=n.x,n.py=n.y}function Zu(n){n.fixed&amp;=-5}function Vu(n,t,e){var r=0,u=0;if(n.charge=0,!n.leaf)for(var i,o=n.nodes,a=o.length,c=-1;++c&lt;a;)i=o[c],null!=i&amp;&amp;(Vu(i,t,e),n.charge+=i.charge,r+=i.charge*i.cx,u+=i.charge*i.cy);if(n.point){n.leaf||(n.point.x+=Math.random()-.5,n.point.y+=Math.random()-.5);var s=t*e[n.point.index];n.charge+=n.pointCharge=s,r+=s*n.point.x,u+=s*n.point.y}n.cx=r/n.char
 ge,n.cy=u/n.charge}function Xu(n,t){return Zo.rebind(n,t,&quot;sort&quot;,&quot;children&quot;,&quot;value&quot;),n.nodes=n,n.links=Ku,n}function $u(n,t){for(var e=[n];null!=(n=e.pop());)if(t(n),(u=n.children)&amp;&amp;(r=u.length))for(var r,u;--r&gt;=0;)e.push(u[r])}function Bu(n,t){for(var e=[n],r=[];null!=(n=e.pop());)if(r.push(n),(i=n.children)&amp;&amp;(u=i.length))for(var u,i,o=-1;++o&lt;u;)e.push(i[o]);for(;null!=(n=r.pop());)t(n)}function Wu(n){return n.children}function Ju(n){return n.value}function Gu(n,t){return t.value-n.value}function Ku(n){return Zo.merge(n.map(function(n){return(n.children||[]).map(function(t){return{source:n,target:t}})}))}function Qu(n){return n.x}function ni(n){return n.y}function ti(n,t,e){n.y0=t,n.y=e}function ei(n){return Zo.range(n.length)}function ri(n){for(var t=-1,e=n[0].length,r=[];++t&lt;e;)r[t]=0;return r}function ui(n){for(var t,e=1,r=0,u=n[0][1],i=n.length;i&gt;e;++e)(t=n[e][1])&gt;u&amp;&amp;(r=e,u=t);return r}function ii(n){re
 turn n.reduce(oi,0)}function oi(n,t){return n+t[1]}function ai(n,t){return ci(n,Math.ceil(Math.log(t.length)/Math.LN2+1))}function ci(n,t){for(var e=-1,r=+n[0],u=(n[1]-r)/t,i=[];++e&lt;=t;)i[e]=u*e+r;return i}function si(n){return[Zo.min(n),Zo.max(n)]}function li(n,t){return n.value-t.value}function fi(n,t){var e=n._pack_next;n._pack_next=t,t._pack_prev=n,t._pack_next=e,e._pack_prev=t}function hi(n,t){n._pack_next=t,t._pack_prev=n}function gi(n,t){var e=t.x-n.x,r=t.y-n.y,u=n.r+t.r;return.999*u*u&gt;e*e+r*r}function pi(n){function t(n){l=Math.min(n.x-n.r,l),f=Math.max(n.x+n.r,f),h=Math.min(n.y-n.r,h),g=Math.max(n.y+n.r,g)}if((e=n.children)&amp;&amp;(s=e.length)){var e,r,u,i,o,a,c,s,l=1/0,f=-1/0,h=1/0,g=-1/0;if(e.forEach(vi),r=e[0],r.x=-r.r,r.y=0,t(r),s&gt;1&amp;&amp;(u=e[1],u.x=u.r,u.y=0,t(u),s&gt;2))for(i=e[2],yi(r,u,i),t(i),fi(r,i),r._pack_prev=i,fi(i,u),u=r._pack_next,o=3;s&gt;o;o++){yi(r,u,i=e[o]);var p=0,v=1,d=1;for(a=u._pack_next;a!==u;a=a._pack_next,v++)if(gi(a,i)){p=1
 ;break}if(1==p)for(c=r._pack_prev;c!==a._pack_prev&amp;&amp;!gi(c,i);c=c._pack_prev,d++);p?(d&gt;v||v==d&amp;&amp;u.r&lt;r.r?hi(r,u=a):hi(r=c,u),o--):(fi(r,i),u=i,t(i))}var m=(l+f)/2,y=(h+g)/2,x=0;for(o=0;s&gt;o;o++)i=e[o],i.x-=m,i.y-=y,x=Math.max(x,i.r+Math.sqrt(i.x*i.x+i.y*i.y));n.r=x,e.forEach(di)}}function vi(n){n._pack_next=n._pack_prev=n}function di(n){delete n._pack_next,delete n._pack_prev}function mi(n,t,e,r){var u=n.children;if(n.x=t+=r*n.x,n.y=e+=r*n.y,n.r*=r,u)for(var i=-1,o=u.length;++i&lt;o;)mi(u[i],t,e,r)}function yi(n,t,e){var r=n.r+e.r,u=t.x-n.x,i=t.y-n.y;if(r&amp;&amp;(u||i)){var o=t.r+e.r,a=u*u+i*i;o*=o,r*=r;var c=.5+(r-o)/(2*a),s=Math.sqrt(Math.max(0,2*o*(r+a)-(r-=a)*r-o*o))/(2*a);e.x=n.x+c*u+s*i,e.y=n.y+c*i-s*u}else e.x=n.x+r,e.y=n.y}function xi(n,t){return n.parent==t.parent?1:2}function Mi(n){var t=n.children;return t.length?t[0]:n.t}function _i(n){var t,e=n.children;return(t=e.length)?e[t-1]:n.t}function bi(n,t,e){var r=e/(t.i-n.i);t.c-=r,t.s+=e,n.c+=
 r,t.z+=e,t.m+=e}function wi(n){for(var t,e=0,r=0,u=n.children,i=u.length;--i&gt;=0;)t=u[i],t.z+=e,t.m+=e,e+=t.s+(r+=t.c)}function Si(n,t,e){return n.a.parent===t.parent?n.a:e}function ki(n){return 1+Zo.max(n,function(n){return n.y})}function Ei(n){return n.reduce(function(n,t){return n+t.x},0)/n.length}function Ai(n){var t=n.children;return t&amp;&amp;t.length?Ai(t[0]):n}function Ci(n){var t,e=n.children;return e&amp;&amp;(t=e.length)?Ci(e[t-1]):n}function Ni(n){return{x:n.x,y:n.y,dx:n.dx,dy:n.dy}}function zi(n,t){var e=n.x+t[3],r=n.y+t[0],u=n.dx-t[1]-t[3],i=n.dy-t[0]-t[2];return 0&gt;u&amp;&amp;(e+=u/2,u=0),0&gt;i&amp;&amp;(r+=i/2,i=0),{x:e,y:r,dx:u,dy:i}}function Li(n){var t=n[0],e=n[n.length-1];return e&gt;t?[t,e]:[e,t]}function Ti(n){return n.rangeExtent?n.rangeExtent():Li(n.range())}function qi(n,t,e,r){var u=e(n[0],n[1]),i=r(t[0],t[1]);return function(n){return i(u(n))}}function Ri(n,t){var e,r=0,u=n.length-1,i=n[r],o=n[u];return i&gt;o&amp;&amp;(e=r,r=u,u=e,e=i,i=o,o=
 e),n[r]=t.floor(i),n[u]=t.ceil(o),n}function Di(n){return n?{floor:function(t){return Math.floor(t/n)*n},ceil:function(t){return Math.ceil(t/n)*n}}:ss}function Pi(n,t,e,r){var u=[],i=[],o=0,a=Math.min(n.length,t.length)-1;for(n[a]&lt;n[0]&amp;&amp;(n=n.slice().reverse(),t=t.slice().reverse());++o&lt;=a;)u.push(e(n[o-1],n[o])),i.push(r(t[o-1],t[o]));return function(t){var e=Zo.bisect(n,t,1,a)-1;return i[e](u[e](t))}}function Ui(n,t,e,r){function u(){var u=Math.min(n.length,t.length)&gt;2?Pi:qi,c=r?Uu:Pu;return o=u(n,t,c,e),a=u(t,n,c,hu),i}function i(n){return o(n)}var o,a;return i.invert=function(n){return a(n)},i.domain=function(t){return arguments.length?(n=t.map(Number),u()):n},i.range=function(n){return arguments.length?(t=n,u()):t},i.rangeRound=function(n){return i.range(n).interpolate(zu)},i.clamp=function(n){return arguments.length?(r=n,u()):r},i.interpolate=function(n){return arguments.length?(e=n,u()):e},i.ticks=function(t){return Oi(n,t)},i.tickFormat=function(t,e){
 return Yi(n,t,e)},i.nice=function(t){return Hi(n,t),u()},i.copy=function(){return Ui(n,t,e,r)},u()}function ji(n,t){return Zo.rebind(n,t,&quot;range&quot;,&quot;rangeRound&quot;,&quot;interpolate&quot;,&quot;clamp&quot;)}function Hi(n,t){return Ri(n,Di(Fi(n,t)[2]))}function Fi(n,t){null==t&amp;&amp;(t=10);var e=Li(n),r=e[1]-e[0],u=Math.pow(10,Math.floor(Math.log(r/t)/Math.LN10)),i=t/r*u;return.15&gt;=i?u*=10:.35&gt;=i?u*=5:.75&gt;=i&amp;&amp;(u*=2),e[0]=Math.ceil(e[0]/u)*u,e[1]=Math.floor(e[1]/u)*u+.5*u,e[2]=u,e}function Oi(n,t){return Zo.range.apply(Zo,Fi(n,t))}function Yi(n,t,e){var r=Fi(n,t);if(e){var u=Ga.exec(e);if(u.shift(),&quot;s&quot;===u[8]){var i=Zo.formatPrefix(Math.max(ua(r[0]),ua(r[1])));return u[7]||(u[7]=&quot;.&quot;+Ii(i.scale(r[2]))),u[8]=&quot;f&quot;,e=Zo.format(u.join(&quot;&quot;)),function(n){return e(i.scale(n))+i.symbol}}u[7]||(u[7]=&quot;.&quot;+Zi(u[8],r)),e=u.join(&quot;&quot;)}else e=&quot;,.&quot;+Ii(r[2])+&quot;f&quot;;return Zo.format(e)}func
 tion Ii(n){return-Math.floor(Math.log(n)/Math.LN10+.01)}function Zi(n,t){var e=Ii(t[2]);return n in ls?Math.abs(e-Ii(Math.max(ua(t[0]),ua(t[1]))))+ +(&quot;e&quot;!==n):e-2*(&quot;%&quot;===n)}function Vi(n,t,e,r){function u(n){return(e?Math.log(0&gt;n?0:n):-Math.log(n&gt;0?0:-n))/Math.log(t)}function i(n){return e?Math.pow(t,n):-Math.pow(t,-n)}function o(t){return n(u(t))}return o.invert=function(t){return i(n.invert(t))},o.domain=function(t){return arguments.length?(e=t[0]&gt;=0,n.domain((r=t.map(Number)).map(u)),o):r},o.base=function(e){return arguments.length?(t=+e,n.domain(r.map(u)),o):t},o.nice=function(){var t=Ri(r.map(u),e?Math:hs);return n.domain(t),r=t.map(i),o},o.ticks=function(){var n=Li(r),o=[],a=n[0],c=n[1],s=Math.floor(u(a)),l=Math.ceil(u(c)),f=t%1?2:t;if(isFinite(l-s)){if(e){for(;l&gt;s;s++)for(var h=1;f&gt;h;h++)o.push(i(s)*h);o.push(i(s))}else for(o.push(i(s));s++&lt;l;)for(var h=f-1;h&gt;0;h--)o.push(i(s)*h);for(s=0;o[s]&lt;a;s++);for(l=o.length;o[l-1]&gt;
 c;l--);o=o.slice(s,l)}return o},o.tickFormat=function(n,t){if(!arguments.length)return fs;arguments.length&lt;2?t=fs:&quot;function&quot;!=typeof t&amp;&amp;(t=Zo.format(t));var r,a=Math.max(.1,n/o.ticks().length),c=e?(r=1e-12,Math.ceil):(r=-1e-12,Math.floor);return function(n){return n/i(c(u(n)+r))&lt;=a?t(n):&quot;&quot;}},o.copy=function(){return Vi(n.copy(),t,e,r)},ji(o,n)}function Xi(n,t,e){function r(t){return n(u(t))}var u=$i(t),i=$i(1/t);return r.invert=function(t){return i(n.invert(t))},r.domain=function(t){return arguments.length?(n.domain((e=t.map(Number)).map(u)),r):e},r.ticks=function(n){return Oi(e,n)},r.tickFormat=function(n,t){return Yi(e,n,t)},r.nice=function(n){return r.domain(Hi(e,n))},r.exponent=function(o){return arguments.length?(u=$i(t=o),i=$i(1/t),n.domain(e.map(u)),r):t},r.copy=function(){return Xi(n.copy(),t,e)},ji(r,n)}function $i(n){return function(t){return 0&gt;t?-Math.pow(-t,n):Math.pow(t,n)}}function Bi(n,t){function e(e){return i[((u.get(e)||
 (&quot;range&quot;===t.t?u.set(e,n.push(e)):0/0))-1)%i.length]}function r(t,e){return Zo.range(n.length).map(function(n){return t+e*n})}var u,i,a;return e.domain=function(r){if(!arguments.length)return n;n=[],u=new o;for(var i,a=-1,c=r.length;++a&lt;c;)u.has(i=r[a])||u.set(i,n.push(i));return e[t.t].apply(e,t.a)},e.range=function(n){return arguments.length?(i=n,a=0,t={t:&quot;range&quot;,a:arguments},e):i},e.rangePoints=function(u,o){arguments.length&lt;2&amp;&amp;(o=0);var c=u[0],s=u[1],l=(s-c)/(Math.max(1,n.length-1)+o);return i=r(n.length&lt;2?(c+s)/2:c+l*o/2,l),a=0,t={t:&quot;rangePoints&quot;,a:arguments},e},e.rangeBands=function(u,o,c){arguments.length&lt;2&amp;&amp;(o=0),arguments.length&lt;3&amp;&amp;(c=o);var s=u[1]&lt;u[0],l=u[s-0],f=u[1-s],h=(f-l)/(n.length-o+2*c);return i=r(l+h*c,h),s&amp;&amp;i.reverse(),a=h*(1-o),t={t:&quot;rangeBands&quot;,a:arguments},e},e.rangeRoundBands=function(u,o,c){arguments.length&lt;2&amp;&amp;(o=0),arguments.length&lt;3&amp;&amp;(c=o
 );var s=u[1]&lt;u[0],l=u[s-0],f=u[1-s],h=Math.floor((f-l)/(n.length-o+2*c)),g=f-l-(n.length-o)*h;return i=r(l+Math.round(g/2),h),s&amp;&amp;i.reverse(),a=Math.round(h*(1-o)),t={t:&quot;rangeRoundBands&quot;,a:arguments},e},e.rangeBand=function(){return a},e.rangeExtent=function(){return Li(t.a[0])},e.copy=function(){return Bi(n,t)},e.domain(n)}function Wi(e,r){function u(){var n=0,t=r.length;for(o=[];++n&lt;t;)o[n-1]=Zo.quantile(e,n/t);return i}function i(n){return isNaN(n=+n)?void 0:r[Zo.bisect(o,n)]}var o;return i.domain=function(r){return arguments.length?(e=r.filter(t).sort(n),u()):e},i.range=function(n){return arguments.length?(r=n,u()):r},i.quantiles=function(){return o},i.invertExtent=function(n){return n=r.indexOf(n),0&gt;n?[0/0,0/0]:[n&gt;0?o[n-1]:e[0],n&lt;o.length?o[n]:e[e.length-1]]},i.copy=function(){return Wi(e,r)},u()}function Ji(n,t,e){function r(t){return e[Math.max(0,Math.min(o,Math.floor(i*(t-n))))]}function u(){return i=e.length/(t-n),o=e.length-1,r}var i
 ,o;return r.domain=function(e){return arguments.length?(n=+e[0],t=+e[e.length-1],u()):[n,t]},r.range=function(n){return arguments.length?(e=n,u()):e},r.invertExtent=function(t){return t=e.indexOf(t),t=0&gt;t?0/0:t/i+n,[t,t+1/i]},r.copy=function(){return Ji(n,t,e)},u()}function Gi(n,t){function e(e){return e&gt;=e?t[Zo.bisect(n,e)]:void 0}return e.domain=function(t){return arguments.length?(n=t,e):n},e.range=function(n){return arguments.length?(t=n,e):t},e.invertExtent=function(e){return e=t.indexOf(e),[n[e-1],n[e]]},e.copy=function(){return Gi(n,t)},e}function Ki(n){function t(n){return+n}return t.invert=t,t.domain=t.range=function(e){return arguments.length?(n=e.map(t),t):n},t.ticks=function(t){return Oi(n,t)},t.tickFormat=function(t,e){return Yi(n,t,e)},t.copy=function(){return Ki(n)},t}function Qi(n){return n.innerRadius}function no(n){return n.outerRadius}function to(n){return n.startAngle}function eo(n){return n.endAngle}function ro(n){function t(t){function o(){s.push(
 &quot;M&quot;,i(n(l),a))}for(var c,s=[],l=[],f=-1,h=t.length,g=bt(e),p=bt(r);++f&lt;h;)u.call(this,c=t[f],f)?l.push([+g.call(this,c,f),+p.call(this,c,f)]):l.length&amp;&amp;(o(),l=[]);return l.length&amp;&amp;o(),s.length?s.join(&quot;&quot;):null}var e=wr,r=Sr,u=we,i=uo,o=i.key,a=.7;return t.x=function(n){return arguments.length?(e=n,t):e},t.y=function(n){return arguments.length?(r=n,t):r},t.defined=function(n){return arguments.length?(u=n,t):u},t.interpolate=function(n){return arguments.length?(o=&quot;function&quot;==typeof n?i=n:(i=xs.get(n)||uo).key,t):o},t.tension=function(n){return arguments.length?(a=n,t):a},t}function uo(n){return n.join(&quot;L&quot;)}function io(n){return uo(n)+&quot;Z&quot;}function oo(n){for(var t=0,e=n.length,r=n[0],u=[r[0],&quot;,&quot;,r[1]];++t&lt;e;)u.push(&quot;H&quot;,(r[0]+(r=n[t])[0])/2,&quot;V&quot;,r[1]);return e&gt;1&amp;&amp;u.push(&quot;H&quot;,r[0]),u.join(&quot;&quot;)}function ao(n){for(var t=0,e=n.length,r=n[0],u=[r[0],&quot;,&
 quot;,r[1]];++t&lt;e;)u.push(&quot;V&quot;,(r=n[t])[1],&quot;H&quot;,r[0]);return u.join(&quot;&quot;)}function co(n){for(var t=0,e=n.length,r=n[0],u=[r[0],&quot;,&quot;,r[1]];++t&lt;e;)u.push(&quot;H&quot;,(r=n[t])[0],&quot;V&quot;,r[1]);return u.join(&quot;&quot;)}function so(n,t){return n.length&lt;4?uo(n):n[1]+ho(n.slice(1,n.length-1),go(n,t))}function lo(n,t){return n.length&lt;3?uo(n):n[0]+ho((n.push(n[0]),n),go([n[n.length-2]].concat(n,[n[1]]),t))}function fo(n,t){return n.length&lt;3?uo(n):n[0]+ho(n,go(n,t))}function ho(n,t){if(t.length&lt;1||n.length!=t.length&amp;&amp;n.length!=t.length+2)return uo(n);var e=n.length!=t.length,r=&quot;&quot;,u=n[0],i=n[1],o=t[0],a=o,c=1;if(e&amp;&amp;(r+=&quot;Q&quot;+(i[0]-2*o[0]/3)+&quot;,&quot;+(i[1]-2*o[1]/3)+&quot;,&quot;+i[0]+&quot;,&quot;+i[1],u=n[1],c=2),t.length&gt;1){a=t[1],i=n[c],c++,r+=&quot;C&quot;+(u[0]+o[0])+&quot;,&quot;+(u[1]+o[1])+&quot;,&quot;+(i[0]-a[0])+&quot;,&quot;+(i[1]-a[1])+&quot;,&quot;+i[0]+&quot;,&quot;+
 i[1];for(var s=2;s&lt;t.length;s++,c++)i=n[c],a=t[s],r+=&quot;S&quot;+(i[0]-a[0])+&quot;,&quot;+(i[1]-a[1])+&quot;,&quot;+i[0]+&quot;,&quot;+i[1]}if(e){var l=n[c];r+=&quot;Q&quot;+(i[0]+2*a[0]/3)+&quot;,&quot;+(i[1]+2*a[1]/3)+&quot;,&quot;+l[0]+&quot;,&quot;+l[1]}return r}function go(n,t){for(var e,r=[],u=(1-t)/2,i=n[0],o=n[1],a=1,c=n.length;++a&lt;c;)e=i,i=o,o=n[a],r.push([u*(o[0]-e[0]),u*(o[1]-e[1])]);return r}function po(n){if(n.length&lt;3)return uo(n);var t=1,e=n.length,r=n[0],u=r[0],i=r[1],o=[u,u,u,(r=n[1])[0]],a=[i,i,i,r[1]],c=[u,&quot;,&quot;,i,&quot;L&quot;,xo(bs,o),&quot;,&quot;,xo(bs,a)];for(n.push(n[e-1]);++t&lt;=e;)r=n[t],o.shift(),o.push(r[0]),a.shift(),a.push(r[1]),Mo(c,o,a);return n.pop(),c.push(&quot;L&quot;,r),c.join(&quot;&quot;)}function vo(n){if(n.length&lt;4)return uo(n);for(var t,e=[],r=-1,u=n.length,i=[0],o=[0];++r&lt;3;)t=n[r],i.push(t[0]),o.push(t[1]);for(e.push(xo(bs,i)+&quot;,&quot;+xo(bs,o)),--r;++r&lt;u;)t=n[r],i.shift(),i.push(t[0]),o.shift(),o
 .push(t[1]),Mo(e,i,o);return e.join(&quot;&quot;)}function mo(n){for(var t,e,r=-1,u=n.length,i=u+4,o=[],a=[];++r&lt;4;)e=n[r%u],o.push(e[0]),a.push(e[1]);for(t=[xo(bs,o),&quot;,&quot;,xo(bs,a)],--r;++r&lt;i;)e=n[r%u],o.shift(),o.push(e[0]),a.shift(),a.push(e[1]),Mo(t,o,a);return t.join(&quot;&quot;)}function yo(n,t){var e=n.length-1;if(e)for(var r,u,i=n[0][0],o=n[0][1],a=n[e][0]-i,c=n[e][1]-o,s=-1;++s&lt;=e;)r=n[s],u=s/e,r[0]=t*r[0]+(1-t)*(i+u*a),r[1]=t*r[1]+(1-t)*(o+u*c);return po(n)}function xo(n,t){return n[0]*t[0]+n[1]*t[1]+n[2]*t[2]+n[3]*t[3]}function Mo(n,t,e){n.push(&quot;C&quot;,xo(Ms,t),&quot;,&quot;,xo(Ms,e),&quot;,&quot;,xo(_s,t),&quot;,&quot;,xo(_s,e),&quot;,&quot;,xo(bs,t),&quot;,&quot;,xo(bs,e))}function _o(n,t){return(t[1]-n[1])/(t[0]-n[0])}function bo(n){for(var t=0,e=n.length-1,r=[],u=n[0],i=n[1],o=r[0]=_o(u,i);++t&lt;e;)r[t]=(o+(o=_o(u=i,i=n[t+1])))/2;return r[t]=o,r}function wo(n){for(var t,e,r,u,i=[],o=bo(n),a=-1,c=n.length-1;++a&lt;c;)t=_o(n[a],n[a+1]),u
 a(t)&lt;ka?o[a]=o[a+1]=0:(e=o[a]/t,r=o[a+1]/t,u=e*e+r*r,u&gt;9&amp;&amp;(u=3*t/Math.sqrt(u),o[a]=u*e,o[a+1]=u*r));for(a=-1;++a&lt;=c;)u=(n[Math.min(c,a+1)][0]-n[Math.max(0,a-1)][0])/(6*(1+o[a]*o[a])),i.push([u||0,o[a]*u||0]);return i}function So(n){return n.length&lt;3?uo(n):n[0]+ho(n,wo(n))}function ko(n){for(var t,e,r,u=-1,i=n.length;++u&lt;i;)t=n[u],e=t[0],r=t[1]+ms,t[0]=e*Math.cos(r),t[1]=e*Math.sin(r);return n}function Eo(n){function t(t){function c(){v.push(&quot;M&quot;,a(n(m),f),l,s(n(d.reverse()),f),&quot;Z&quot;)}for(var h,g,p,v=[],d=[],m=[],y=-1,x=t.length,M=bt(e),_=bt(u),b=e===r?function(){return g}:bt(r),w=u===i?function(){return p}:bt(i);++y&lt;x;)o.call(this,h=t[y],y)?(d.push([g=+M.call(this,h,y),p=+_.call(this,h,y)]),m.push([+b.call(this,h,y),+w.call(this,h,y)])):d.length&amp;&amp;(c(),d=[],m=[]);return d.length&amp;&amp;c(),v.length?v.join(&quot;&quot;):null}var e=wr,r=wr,u=0,i=Sr,o=we,a=uo,c=a.key,s=a,l=&quot;L&quot;,f=.7;return t.x=function(n){return argum
 ents.length?(e=r=n,t):r},t.x0=function(n){return arguments.length?(e=n,t):e},t.x1=function(n){return arguments.length?(r=n,t):r},t.y=function(n){return arguments.length?(u=i=n,t):i},t.y0=function(n){return arguments.length?(u=n,t):u},t.y1=function(n){return arguments.length?(i=n,t):i},t.defined=function(n){return arguments.length?(o=n,t):o},t.interpolate=function(n){return arguments.length?(c=&quot;function&quot;==typeof n?a=n:(a=xs.get(n)||uo).key,s=a.reverse||a,l=a.closed?&quot;M&quot;:&quot;L&quot;,t):c},t.tension=function(n){return arguments.length?(f=n,t):f},t}function Ao(n){return n.radius}function Co(n){return[n.x,n.y]}function No(n){return function(){var t=n.apply(this,arguments),e=t[0],r=t[1]+ms;return[e*Math.cos(r),e*Math.sin(r)]}}function zo(){return 64}function Lo(){return&quot;circle&quot;}function To(n){var t=Math.sqrt(n/ba);return&quot;M0,&quot;+t+&quot;A&quot;+t+&quot;,&quot;+t+&quot; 0 1,1 0,&quot;+-t+&quot;A&quot;+t+&quot;,&quot;+t+&quot; 0 1,1 0,&quot;+t+&
 quot;Z&quot;}function qo(n,t){return sa(n,Cs),n.id=t,n}function Ro(n,t,e,r){var u=n.id;return P(n,&quot;function&quot;==typeof e?function(n,i,o){n.__transition__[u].tween.set(t,r(e.call(n,n.__data__,i,o)))}:(e=r(e),function(n){n.__transition__[u].tween.set(t,e)}))}function Do(n){return null==n&amp;&amp;(n=&quot;&quot;),function(){this.textContent=n}}function Po(n,t,e,r){var u=n.__transition__||(n.__transition__={active:0,count:0}),i=u[e];if(!i){var a=r.time;i=u[e]={tween:new o,time:a,ease:r.ease,delay:r.delay,duration:r.duration},++u.count,Zo.timer(function(r){function o(r){return u.active&gt;e?s():(u.active=e,i.event&amp;&amp;i.event.start.call(n,l,t),i.tween.forEach(function(e,r){(r=r.call(n,l,t))&amp;&amp;v.push(r)}),Zo.timer(function(){return p.c=c(r||1)?we:c,1},0,a),void 0)}function c(r){if(u.active!==e)return s();for(var o=r/g,a=f(o),c=v.length;c&gt;0;)v[--c].call(n,a);
+return o&gt;=1?(i.event&amp;&amp;i.event.end.call(n,l,t),s()):void 0}function s(){return--u.count?delete u[e]:delete n.__transition__,1}var l=n.__data__,f=i.ease,h=i.delay,g=i.duration,p=Ba,v=[];return p.t=h+a,r&gt;=h?o(r-h):(p.c=o,void 0)},0,a)}}function Uo(n,t){n.attr(&quot;transform&quot;,function(n){return&quot;translate(&quot;+t(n)+&quot;,0)&quot;})}function jo(n,t){n.attr(&quot;transform&quot;,function(n){return&quot;translate(0,&quot;+t(n)+&quot;)&quot;})}function Ho(n){return n.toISOString()}function Fo(n,t,e){function r(t){return n(t)}function u(n,e){var r=n[1]-n[0],u=r/e,i=Zo.bisect(Us,u);return i==Us.length?[t.year,Fi(n.map(function(n){return n/31536e6}),e)[2]]:i?t[u/Us[i-1]&lt;Us[i]/u?i-1:i]:[Fs,Fi(n,e)[2]]}return r.invert=function(t){return Oo(n.invert(t))},r.domain=function(t){return arguments.length?(n.domain(t),r):n.domain().map(Oo)},r.nice=function(n,t){function e(e){return!isNaN(e)&amp;&amp;!n.range(e,Oo(+e+1),t).length}var i=r.domain(),o=Li(i),a=null==n?u(
 o,10):&quot;number&quot;==typeof n&amp;&amp;u(o,n);return a&amp;&amp;(n=a[0],t=a[1]),r.domain(Ri(i,t&gt;1?{floor:function(t){for(;e(t=n.floor(t));)t=Oo(t-1);return t},ceil:function(t){for(;e(t=n.ceil(t));)t=Oo(+t+1);return t}}:n))},r.ticks=function(n,t){var e=Li(r.domain()),i=null==n?u(e,10):&quot;number&quot;==typeof n?u(e,n):!n.range&amp;&amp;[{range:n},t];return i&amp;&amp;(n=i[0],t=i[1]),n.range(e[0],Oo(+e[1]+1),1&gt;t?1:t)},r.tickFormat=function(){return e},r.copy=function(){return Fo(n.copy(),t,e)},ji(r,n)}function Oo(n){return new Date(n)}function Yo(n){return JSON.parse(n.responseText)}function Io(n){var t=$o.createRange();return t.selectNode($o.body),t.createContextualFragment(n.responseText)}var Zo={version:&quot;3.4.11&quot;};Date.now||(Date.now=function(){return+new Date});var Vo=[].slice,Xo=function(n){return Vo.call(n)},$o=document,Bo=$o.documentElement,Wo=window;try{Xo(Bo.childNodes)[0].nodeType}catch(Jo){Xo=function(n){for(var t=n.length,e=new Array(t);t--;)e
 [t]=n[t];return e}}try{$o.createElement(&quot;div&quot;).style.setProperty(&quot;opacity&quot;,0,&quot;&quot;)}catch(Go){var Ko=Wo.Element.prototype,Qo=Ko.setAttribute,na=Ko.setAttributeNS,ta=Wo.CSSStyleDeclaration.prototype,ea=ta.setProperty;Ko.setAttribute=function(n,t){Qo.call(this,n,t+&quot;&quot;)},Ko.setAttributeNS=function(n,t,e){na.call(this,n,t,e+&quot;&quot;)},ta.setProperty=function(n,t,e){ea.call(this,n,t+&quot;&quot;,e)}}Zo.ascending=n,Zo.descending=function(n,t){return n&gt;t?-1:t&gt;n?1:t&gt;=n?0:0/0},Zo.min=function(n,t){var e,r,u=-1,i=n.length;if(1===arguments.length){for(;++u&lt;i&amp;&amp;!(null!=(e=n[u])&amp;&amp;e&gt;=e);)e=void 0;for(;++u&lt;i;)null!=(r=n[u])&amp;&amp;e&gt;r&amp;&amp;(e=r)}else{for(;++u&lt;i&amp;&amp;!(null!=(e=t.call(n,n[u],u))&amp;&amp;e&gt;=e);)e=void 0;for(;++u&lt;i;)null!=(r=t.call(n,n[u],u))&amp;&amp;e&gt;r&amp;&amp;(e=r)}return e},Zo.max=function(n,t){var e,r,u=-1,i=n.length;if(1===arguments.length){for(;++u&lt;i&amp;&amp;!(null!
 =(e=n[u])&amp;&amp;e&gt;=e);)e=void 0;for(;++u&lt;i;)null!=(r=n[u])&amp;&amp;r&gt;e&amp;&amp;(e=r)}else{for(;++u&lt;i&amp;&amp;!(null!=(e=t.call(n,n[u],u))&amp;&amp;e&gt;=e);)e=void 0;for(;++u&lt;i;)null!=(r=t.call(n,n[u],u))&amp;&amp;r&gt;e&amp;&amp;(e=r)}return e},Zo.extent=function(n,t){var e,r,u,i=-1,o=n.length;if(1===arguments.length){for(;++i&lt;o&amp;&amp;!(null!=(e=u=n[i])&amp;&amp;e&gt;=e);)e=u=void 0;for(;++i&lt;o;)null!=(r=n[i])&amp;&amp;(e&gt;r&amp;&amp;(e=r),r&gt;u&amp;&amp;(u=r))}else{for(;++i&lt;o&amp;&amp;!(null!=(e=u=t.call(n,n[i],i))&amp;&amp;e&gt;=e);)e=void 0;for(;++i&lt;o;)null!=(r=t.call(n,n[i],i))&amp;&amp;(e&gt;r&amp;&amp;(e=r),r&gt;u&amp;&amp;(u=r))}return[e,u]},Zo.sum=function(n,t){var e,r=0,u=n.length,i=-1;if(1===arguments.length)for(;++i&lt;u;)isNaN(e=+n[i])||(r+=e);else for(;++i&lt;u;)isNaN(e=+t.call(n,n[i],i))||(r+=e);return r},Zo.mean=function(n,e){var r,u=0,i=n.length,o=-1,a=i;if(1===arguments.length)for(;++o&lt;i;)t(r=n[o])?u+=r:--a;else for(
 ;++o&lt;i;)t(r=e.call(n,n[o],o))?u+=r:--a;return a?u/a:void 0},Zo.quantile=function(n,t){var e=(n.length-1)*t+1,r=Math.floor(e),u=+n[r-1],i=e-r;return i?u+i*(n[r]-u):u},Zo.median=function(e,r){return arguments.length&gt;1&amp;&amp;(e=e.map(r)),e=e.filter(t),e.length?Zo.quantile(e.sort(n),.5):void 0};var ra=e(n);Zo.bisectLeft=ra.left,Zo.bisect=Zo.bisectRight=ra.right,Zo.bisector=function(t){return e(1===t.length?function(e,r){return n(t(e),r)}:t)},Zo.shuffle=function(n){for(var t,e,r=n.length;r;)e=0|Math.random()*r--,t=n[r],n[r]=n[e],n[e]=t;return n},Zo.permute=function(n,t){for(var e=t.length,r=new Array(e);e--;)r[e]=n[t[e]];return r},Zo.pairs=function(n){for(var t,e=0,r=n.length-1,u=n[0],i=new Array(0&gt;r?0:r);r&gt;e;)i[e]=[t=u,u=n[++e]];return i},Zo.zip=function(){if(!(u=arguments.length))return[];for(var n=-1,t=Zo.min(arguments,r),e=new Array(t);++n&lt;t;)for(var u,i=-1,o=e[n]=new Array(u);++i&lt;u;)o[i]=arguments[i][n];return e},Zo.transpose=function(n){return Zo.zip.ap
 ply(Zo,n)},Zo.keys=function(n){var t=[];for(var e in n)t.push(e);return t},Zo.values=function(n){var t=[];for(var e in n)t.push(n[e]);return t},Zo.entries=function(n){var t=[];for(var e in n)t.push({key:e,value:n[e]});return t},Zo.merge=function(n){for(var t,e,r,u=n.length,i=-1,o=0;++i&lt;u;)o+=n[i].length;for(e=new Array(o);--u&gt;=0;)for(r=n[u],t=r.length;--t&gt;=0;)e[--o]=r[t];return e};var ua=Math.abs;Zo.range=function(n,t,e){if(arguments.length&lt;3&amp;&amp;(e=1,arguments.length&lt;2&amp;&amp;(t=n,n=0)),1/0===(t-n)/e)throw new Error(&quot;infinite range&quot;);var r,i=[],o=u(ua(e)),a=-1;if(n*=o,t*=o,e*=o,0&gt;e)for(;(r=n+e*++a)&gt;t;)i.push(r/o);else for(;(r=n+e*++a)&lt;t;)i.push(r/o);return i},Zo.map=function(n){var t=new o;if(n instanceof o)n.forEach(function(n,e){t.set(n,e)});else for(var e in n)t.set(e,n[e]);return t},i(o,{has:a,get:function(n){return this[ia+n]},set:function(n,t){return this[ia+n]=t},remove:c,keys:s,values:function(){var n=[];return this.forEach(f
 unction(t,e){n.push(e)}),n},entries:function(){var n=[];return this.forEach(function(t,e){n.push({key:t,value:e})}),n},size:l,empty:f,forEach:function(n){for(var t in this)t.charCodeAt(0)===oa&amp;&amp;n.call(this,t.substring(1),this[t])}});var ia=&quot;\x00&quot;,oa=ia.charCodeAt(0);Zo.nest=function(){function n(t,a,c){if(c&gt;=i.length)return r?r.call(u,a):e?a.sort(e):a;for(var s,l,f,h,g=-1,p=a.length,v=i[c++],d=new o;++g&lt;p;)(h=d.get(s=v(l=a[g])))?h.push(l):d.set(s,[l]);return t?(l=t(),f=function(e,r){l.set(e,n(t,r,c))}):(l={},f=function(e,r){l[e]=n(t,r,c)}),d.forEach(f),l}function t(n,e){if(e&gt;=i.length)return n;var r=[],u=a[e++];return n.forEach(function(n,u){r.push({key:n,values:t(u,e)})}),u?r.sort(function(n,t){return u(n.key,t.key)}):r}var e,r,u={},i=[],a=[];return u.map=function(t,e){return n(e,t,0)},u.entries=function(e){return t(n(Zo.map,e,0),0)},u.key=function(n){return i.push(n),u},u.sortKeys=function(n){return a[i.length-1]=n,u},u.sortValues=function(n){ret
 urn e=n,u},u.rollup=function(n){return r=n,u},u},Zo.set=function(n){var t=new h;if(n)for(var e=0,r=n.length;r&gt;e;++e)t.add(n[e]);return t},i(h,{has:a,add:function(n){return this[ia+n]=!0,n},remove:function(n){return n=ia+n,n in this&amp;&amp;delete this[n]},values:s,size:l,empty:f,forEach:function(n){for(var t in this)t.charCodeAt(0)===oa&amp;&amp;n.call(this,t.substring(1))}}),Zo.behavior={},Zo.rebind=function(n,t){for(var e,r=1,u=arguments.length;++r&lt;u;)n[e=arguments[r]]=g(n,t,t[e]);return n};var aa=[&quot;webkit&quot;,&quot;ms&quot;,&quot;moz&quot;,&quot;Moz&quot;,&quot;o&quot;,&quot;O&quot;];Zo.dispatch=function(){for(var n=new d,t=-1,e=arguments.length;++t&lt;e;)n[arguments[t]]=m(n);return n},d.prototype.on=function(n,t){var e=n.indexOf(&quot;.&quot;),r=&quot;&quot;;if(e&gt;=0&amp;&amp;(r=n.substring(e+1),n=n.substring(0,e)),n)return arguments.length&lt;2?this[n].on(r):this[n].on(r,t);if(2===arguments.length){if(null==t)for(n in this)this.hasOwnProperty(n)&amp;&amp
 ;this[n].on(r,null);return this}},Zo.event=null,Zo.requote=function(n){return n.replace(ca,&quot;\\$&amp;&quot;)};var ca=/[\\\^\$\*\+\?\|\[\]\(\)\.\{\}]/g,sa={}.__proto__?function(n,t){n.__proto__=t}:function(n,t){for(var e in t)n[e]=t[e]},la=function(n,t){return t.querySelector(n)},fa=function(n,t){return t.querySelectorAll(n)},ha=Bo.matches||Bo[p(Bo,&quot;matchesSelector&quot;)],ga=function(n,t){return ha.call(n,t)};&quot;function&quot;==typeof Sizzle&amp;&amp;(la=function(n,t){return Sizzle(n,t)[0]||null},fa=Sizzle,ga=Sizzle.matchesSelector),Zo.selection=function(){return ma};var pa=Zo.selection.prototype=[];pa.select=function(n){var t,e,r,u,i=[];n=b(n);for(var o=-1,a=this.length;++o&lt;a;){i.push(t=[]),t.parentNode=(r=this[o]).parentNode;for(var c=-1,s=r.length;++c&lt;s;)(u=r[c])?(t.push(e=n.call(u,u.__data__,c,o)),e&amp;&amp;&quot;__data__&quot;in u&amp;&amp;(e.__data__=u.__data__)):t.push(null)}return _(i)},pa.selectAll=function(n){var t,e,r=[];n=w(n);for(var u=-1,i=th
 is.length;++u&lt;i;)for(var o=this[u],a=-1,c=o.length;++a&lt;c;)(e=o[a])&amp;&amp;(r.push(t=Xo(n.call(e,e.__data__,a,u))),t.parentNode=e);return _(r)};var va={svg:&quot;http://www.w3.org/2000/svg&quot;,xhtml:&quot;http://www.w3.org/1999/xhtml&quot;,xlink:&quot;http://www.w3.org/1999/xlink&quot;,xml:&quot;http://www.w3.org/XML/1998/namespace&quot;,xmlns:&quot;http://www.w3.org/2000/xmlns/&quot;};Zo.ns={prefix:va,qualify:function(n){var t=n.indexOf(&quot;:&quot;),e=n;return t&gt;=0&amp;&amp;(e=n.substring(0,t),n=n.substring(t+1)),va.hasOwnProperty(e)?{space:va[e],local:n}:n}},pa.attr=function(n,t){if(arguments.length&lt;2){if(&quot;string&quot;==typeof n){var e=this.node();return n=Zo.ns.qualify(n),n.local?e.getAttributeNS(n.space,n.local):e.getAttribute(n)}for(t in n)this.each(S(t,n[t]));return this}return this.each(S(n,t))},pa.classed=function(n,t){if(arguments.length&lt;2){if(&quot;string&quot;==typeof n){var e=this.node(),r=(n=A(n)).length,u=-1;if(t=e.classList){for(;++u&l
 t;r;)if(!t.contains(n[u]))return!1}else for(t=e.getAttribute(&quot;class&quot;);++u&lt;r;)if(!E(n[u]).test(t))return!1;return!0}for(t in n)this.each(C(t,n[t]));return this}return this.each(C(n,t))},pa.style=function(n,t,e){var r=arguments.length;if(3&gt;r){if(&quot;string&quot;!=typeof n){2&gt;r&amp;&amp;(t=&quot;&quot;);for(e in n)this.each(z(e,n[e],t));return this}if(2&gt;r)return Wo.getComputedStyle(this.node(),null).getPropertyValue(n);e=&quot;&quot;}return this.each(z(n,t,e))},pa.property=function(n,t){if(arguments.length&lt;2){if(&quot;string&quot;==typeof n)return this.node()[n];for(t in n)this.each(L(t,n[t]));return this}return this.each(L(n,t))},pa.text=function(n){return arguments.length?this.each(&quot;function&quot;==typeof n?function(){var t=n.apply(this,arguments);this.textContent=null==t?&quot;&quot;:t}:null==n?function(){this.textContent=&quot;&quot;}:function(){this.textContent=n}):this.node().textContent},pa.html=function(n){return arguments.length?this.eac
 h(&quot;function&quot;==typeof n?function(){var t=n.apply(this,arguments);this.innerHTML=null==t?&quot;&quot;:t}:null==n?function(){this.innerHTML=&quot;&quot;}:function(){this.innerHTML=n}):this.node().innerHTML},pa.append=function(n){return n=T(n),this.select(function(){return this.appendChild(n.apply(this,arguments))})},pa.insert=function(n,t){return n=T(n),t=b(t),this.select(function(){return this.insertBefore(n.apply(this,arguments),t.apply(this,arguments)||null)})},pa.remove=function(){return this.each(function(){var n=this.parentNode;n&amp;&amp;n.removeChild(this)})},pa.data=function(n,t){function e(n,e){var r,u,i,a=n.length,f=e.length,h=Math.min(a,f),g=new Array(f),p=new Array(f),v=new Array(a);if(t){var d,m=new o,y=new o,x=[];for(r=-1;++r&lt;a;)d=t.call(u=n[r],u.__data__,r),m.has(d)?v[r]=u:m.set(d,u),x.push(d);for(r=-1;++r&lt;f;)d=t.call(e,i=e[r],r),(u=m.get(d))?(g[r]=u,u.__data__=i):y.has(d)||(p[r]=q(i)),y.set(d,i),m.remove(d);for(r=-1;++r&lt;a;)m.has(x[r])&amp;&am
 p;(v[r]=n[r])}else{for(r=-1;++r&lt;h;)u=n[r],i=e[r],u?(u.__data__=i,g[r]=u):p[r]=q(i);for(;f&gt;r;++r)p[r]=q(e[r]);for(;a&gt;r;++r)v[r]=n[r]}p.update=g,p.parentNode=g.parentNode=v.parentNode=n.parentNode,c.push(p),s.push(g),l.push(v)}var r,u,i=-1,a=this.length;if(!arguments.length){for(n=new Array(a=(r=this[0]).length);++i&lt;a;)(u=r[i])&amp;&amp;(n[i]=u.__data__);return n}var c=U([]),s=_([]),l=_([]);if(&quot;function&quot;==typeof n)for(;++i&lt;a;)e(r=this[i],n.call(r,r.parentNode.__data__,i));else for(;++i&lt;a;)e(r=this[i],n);return s.enter=function(){return c},s.exit=function(){return l},s},pa.datum=function(n){return arguments.length?this.property(&quot;__data__&quot;,n):this.property(&quot;__data__&quot;)},pa.filter=function(n){var t,e,r,u=[];&quot;function&quot;!=typeof n&amp;&amp;(n=R(n));for(var i=0,o=this.length;o&gt;i;i++){u.push(t=[]),t.parentNode=(e=this[i]).parentNode;for(var a=0,c=e.length;c&gt;a;a++)(r=e[a])&amp;&amp;n.call(r,r.__data__,a,i)&amp;&amp;t.push(r
 )}return _(u)},pa.order=function(){for(var n=-1,t=this.length;++n&lt;t;)for(var e,r=this[n],u=r.length-1,i=r[u];--u&gt;=0;)(e=r[u])&amp;&amp;(i&amp;&amp;i!==e.nextSibling&amp;&amp;i.parentNode.insertBefore(e,i),i=e);return this},pa.sort=function(n){n=D.apply(this,arguments);for(var t=-1,e=this.length;++t&lt;e;)this[t].sort(n);return this.order()},pa.each=function(n){return P(this,function(t,e,r){n.call(t,t.__data__,e,r)})},pa.call=function(n){var t=Xo(arguments);return n.apply(t[0]=this,t),this},pa.empty=function(){return!this.node()},pa.node=function(){for(var n=0,t=this.length;t&gt;n;n++)for(var e=this[n],r=0,u=e.length;u&gt;r;r++){var i=e[r];if(i)return i}return null},pa.size=function(){var n=0;return this.each(function(){++n}),n};var da=[];Zo.selection.enter=U,Zo.selection.enter.prototype=da,da.append=pa.append,da.empty=pa.empty,da.node=pa.node,da.call=pa.call,da.size=pa.size,da.select=function(n){for(var t,e,r,u,i,o=[],a=-1,c=this.length;++a&lt;c;){r=(u=this[a]).update,
 o.push(t=[]),t.parentNode=u.parentNode;for(var s=-1,l=u.length;++s&lt;l;)(i=u[s])?(t.push(r[s]=e=n.call(u.parentNode,i.__data__,s,a)),e.__data__=i.__data__):t.push(null)}return _(o)},da.insert=function(n,t){return arguments.length&lt;2&amp;&amp;(t=j(this)),pa.insert.call(this,n,t)},pa.transition=function(){for(var n,t,e=Ss||++Ns,r=[],u=ks||{time:Date.now(),ease:xu,delay:0,duration:250},i=-1,o=this.length;++i&lt;o;){r.push(n=[]);for(var a=this[i],c=-1,s=a.length;++c&lt;s;)(t=a[c])&amp;&amp;Po(t,c,e,u),n.push(t)}return qo(r,e)},pa.interrupt=function(){return this.each(H)},Zo.select=function(n){var t=[&quot;string&quot;==typeof n?la(n,$o):n];return t.parentNode=Bo,_([t])},Zo.selectAll=function(n){var t=Xo(&quot;string&quot;==typeof n?fa(n,$o):n);return t.parentNode=Bo,_([t])};var ma=Zo.select(Bo);pa.on=function(n,t,e){var r=arguments.length;if(3&gt;r){if(&quot;string&quot;!=typeof n){2&gt;r&amp;&amp;(t=!1);for(e in n)this.each(F(e,n[e],t));return this}if(2&gt;r)return(r=this.no
 de()[&quot;__on&quot;+n])&amp;&amp;r._;e=!1}return this.each(F(n,t,e))};var ya=Zo.map({mouseenter:&quot;mouseover&quot;,mouseleave:&quot;mouseout&quot;});ya.forEach(function(n){&quot;on&quot;+n in $o&amp;&amp;ya.remove(n)});var xa=&quot;onselectstart&quot;in $o?null:p(Bo.style,&quot;userSelect&quot;),Ma=0;Zo.mouse=function(n){return Z(n,x())};var _a=/WebKit/.test(Wo.navigator.userAgent)?-1:0;Zo.touches=function(n,t){return arguments.length&lt;2&amp;&amp;(t=x().touches),t?Xo(t).map(function(t){var e=Z(n,t);return e.identifier=t.identifier,e}):[]},Zo.behavior.drag=function(){function n(){this.on(&quot;mousedown.drag&quot;,u).on(&quot;touchstart.drag&quot;,i)}function t(n,t,u,i,o){return function(){function a(){var n,e,r=t(h,v);r&amp;&amp;(n=r[0]-x[0],e=r[1]-x[1],p|=n|e,x=r,g({type:&quot;drag&quot;,x:r[0]+s[0],y:r[1]+s[1],dx:n,dy:e}))}function c(){t(h,v)&amp;&amp;(m.on(i+d,null).on(o+d,null),y(p&amp;&amp;Zo.event.target===f),g({type:&quot;dragend&quot;}))}var s,l=this,f=Zo.even
 t.target,h=l.parentNode,g=e.of(l,arguments),p=0,v=n(),d=&quot;.drag&quot;+(null==v?&quot;&quot;:&quot;-&quot;+v),m=Zo.select(u()).on(i+d,a).on(o+d,c),y=I(),x=t(h,v);r?(s=r.apply(l,arguments),s=[s.x-x[0],s.y-x[1]]):s=[0,0],g({type:&quot;dragstart&quot;})}}var e=M(n,&quot;drag&quot;,&quot;dragstart&quot;,&quot;dragend&quot;),r=null,u=t(v,Zo.mouse,$,&quot;mousemove&quot;,&quot;mouseup&quot;),i=t(V,Zo.touch,X,&quot;touchmove&quot;,&quot;touchend&quot;);return n.origin=function(t){return arguments.length?(r=t,n):r},Zo.rebind(n,e,&quot;on&quot;)};var ba=Math.PI,wa=2*ba,Sa=ba/2,ka=1e-6,Ea=ka*ka,Aa=ba/180,Ca=180/ba,Na=Math.SQRT2,za=2,La=4;Zo.interpolateZoom=function(n,t){function e(n){var t=n*y;if(m){var e=Q(v),o=i/(za*h)*(e*nt(Na*t+v)-K(v));return[r+o*s,u+o*l,i*e/Q(Na*t+v)]}return[r+n*s,u+n*l,i*Math.exp(Na*t)]}var r=n[0],u=n[1],i=n[2],o=t[0],a=t[1],c=t[2],s=o-r,l=a-u,f=s*s+l*l,h=Math.sqrt(f),g=(c*c-i*i+La*f)/(2*i*za*h),p=(c*c-i*i-La*f)/(2*c*za*h),v=Math.log(Math.sqrt(g*g+1)-g),d=Ma
 th.log(Math.sqrt(p*p+1)-p),m=d-v,y=(m||Math.log(c/i))/Na;return e.duration=1e3*y,e},Zo.behavior.zoom=function(){function n(n){n.on(A,s).on(Ra+&quot;.zoom&quot;,f).on(&quot;dblclick.zoom&quot;,h).on(z,l)}function t(n){return[(n[0]-S.x)/S.k,(n[1]-S.y)/S.k]}function e(n){return[n[0]*S.k+S.x,n[1]*S.k+S.y]}function r(n){S.k=Math.max(E[0],Math.min(E[1],n))}function u(n,t){t=e(t),S.x+=n[0]-t[0],S.y+=n[1]-t[1]}function i(){_&amp;&amp;_.domain(x.range().map(function(n){return(n-S.x)/S.k}).map(x.invert)),w&amp;&amp;w.domain(b.range().map(function(n){return(n-S.y)/S.k}).map(b.invert))}function o(n){n({type:&quot;zoomstart&quot;})}function a(n){i(),n({type:&quot;zoom&quot;,scale:S.k,translate:[S.x,S.y]})}function c(n){n({type:&quot;zoomend&quot;})}function s(){function n(){l=1,u(Zo.mouse(r),h),a(s)}function e(){f.on(C,null).on(N,null),g(l&amp;&amp;Zo.event.target===i),c(s)}var r=this,i=Zo.event.target,s=L.of(r,arguments),l=0,f=Zo.select(Wo).on(C,n).on(N,e),h=t(Zo.mouse(r)),g=I();H.call(
 r),o(s)}function l(){function n(){var n=Zo.touches(g);return h=S.k,n.forEach(function(n){n.identifier in v&amp;&amp;(v[n.identifier]=t(n))}),n}function e(){var t=Zo.event.target;Zo.select(t).on(M,i).on(_,f),b.push(t);for(var e=Zo.event.changedTouches,o=0,c=e.length;c&gt;o;++o)v[e[o].identifier]=null;var s=n(),l=Date.now();if(1===s.length){if(500&gt;l-m){var h=s[0],g=v[h.identifier];r(2*S.k),u(h,g),y(),a(p)}m=l}else if(s.length&gt;1){var h=s[0],x=s[1],w=h[0]-x[0],k=h[1]-x[1];d=w*w+k*k}}function i(){for(var n,t,e,i,o=Zo.touches(g),c=0,s=o.length;s&gt;c;++c,i=null)if(e=o[c],i=v[e.identifier]){if(t)break;n=e,t=i}if(i){var l=(l=e[0]-n[0])*l+(l=e[1]-n[1])*l,f=d&amp;&amp;Math.sqrt(l/d);n=[(n[0]+e[0])/2,(n[1]+e[1])/2],t=[(t[0]+i[0])/2,(t[1]+i[1])/2],r(f*h)}m=null,u(n,t),a(p)}function f(){if(Zo.event.touches.length){for(var t=Zo.event.changedTouches,e=0,r=t.length;r&gt;e;++e)delete v[t[e].identifier];for(var u in v)return void n()}Zo.selectAll(b).on(x,null),w.on(A,s).on(z,l),k(),c(p)
 }var h,g=this,p=L.of(g,arguments),v={},d=0,x=&quot;.zoom-&quot;+Zo.event.changedTouches[0].identifier,M=&quot;touchmove&quot;+x,_=&quot;touchend&quot;+x,b=[],w=Zo.select(g).on(A,null).on(z,e),k=I();H.call(g),e(),o(p)}function f(){var n=L.of(this,arguments);d?clearTimeout(d):(g=t(p=v||Zo.mouse(this)),H.call(this),o(n)),d=setTimeout(function(){d=null,c(n)},50),y(),r(Math.pow(2,.002*Ta())*S.k),u(p,g),a(n)}function h(){var n=L.of(this,arguments),e=Zo.mouse(this),i=t(e),s=Math.log(S.k)/Math.LN2;o(n),r(Math.pow(2,Zo.event.shiftKey?Math.ceil(s)-1:Math.floor(s)+1)),u(e,i),a(n),c(n)}var g,p,v,d,m,x,_,b,w,S={x:0,y:0,k:1},k=[960,500],E=qa,A=&quot;mousedown.zoom&quot;,C=&quot;mousemove.zoom&quot;,N=&quot;mouseup.zoom&quot;,z=&quot;touchstart.zoom&quot;,L=M(n,&quot;zoomstart&quot;,&quot;zoom&quot;,&quot;zoomend&quot;);return n.event=function(n){n.each(function(){var n=L.of(this,arguments),t=S;Ss?Zo.select(this).transition().each(&quot;start.zoom&quot;,function(){S=this.__chart__||{x:0,y:
 0,k:1},o(n)}).tween(&quot;zoom:zoom&quot;,function(){var e=k[0],r=k[1],u=e/2,i=r/2,o=Zo.interpolateZoom([(u-S.x)/S.k,(i-S.y)/S.k,e/S.k],[(u-t.x)/t.k,(i-t.y)/t.k,e/t.k]);return function(t){var r=o(t),c=e/r[2];this.__chart__=S={x:u-r[0]*c,y:i-r[1]*c,k:c},a(n)}}).each(&quot;end.zoom&quot;,function(){c(n)}):(this.__chart__=S,o(n),a(n),c(n))})},n.translate=function(t){return arguments.length?(S={x:+t[0],y:+t[1],k:S.k},i(),n):[S.x,S.y]},n.scale=function(t){return arguments.length?(S={x:S.x,y:S.y,k:+t},i(),n):S.k},n.scaleExtent=function(t){return arguments.length?(E=null==t?qa:[+t[0],+t[1]],n):E},n.center=function(t){return arguments.length?(v=t&amp;&amp;[+t[0],+t[1]],n):v},n.size=function(t){return arguments.length?(k=t&amp;&amp;[+t[0],+t[1]],n):k},n.x=function(t){return arguments.length?(_=t,x=t.copy(),S={x:0,y:0,k:1},n):_},n.y=function(t){return arguments.length?(w=t,b=t.copy(),S={x:0,y:0,k:1},n):w},Zo.rebind(n,L,&quot;on&quot;)};var Ta,qa=[0,1/0],Ra=&quot;onwheel&quot;in $o?(Ta
 =function(){return-Zo.event.deltaY*(Zo.event.deltaMode?120:1)},&quot;wheel&quot;):&quot;onmousewheel&quot;in $o?(Ta=function(){return Zo.event.wheelDelta},&quot;mousewheel&quot;):(Ta=function(){return-Zo.event.detail},&quot;MozMousePixelScroll&quot;);Zo.color=et,et.prototype.toString=function(){return this.rgb()+&quot;&quot;},Zo.hsl=rt;var Da=rt.prototype=new et;Da.brighter=function(n){return n=Math.pow(.7,arguments.length?n:1),new rt(this.h,this.s,this.l/n)},Da.darker=function(n){return n=Math.pow(.7,arguments.length?n:1),new rt(this.h,this.s,n*this.l)},Da.rgb=function(){return ut(this.h,this.s,this.l)},Zo.hcl=it;var Pa=it.prototype=new et;Pa.brighter=function(n){return new it(this.h,this.c,Math.min(100,this.l+Ua*(arguments.length?n:1)))},Pa.darker=function(n){return new it(this.h,this.c,Math.max(0,this.l-Ua*(arguments.length?n:1)))},Pa.rgb=function(){return ot(this.h,this.c,this.l).rgb()},Zo.lab=at;var Ua=18,ja=.95047,Ha=1,Fa=1.08883,Oa=at.prototype=new et;Oa.brighter=func
 tion(n){return new at(Math.min(100,this.l+Ua*(arguments.length?n:1)),this.a,this.b)},Oa.darker=function(n){return new at(Math.max(0,this.l-Ua*(arguments.length?n:1)),this.a,this.b)},Oa.rgb=function(){return ct(this.l,this.a,this.b)},Zo.rgb=gt;var Ya=gt.prototype=new et;Ya.brighter=function(n){n=Math.pow(.7,arguments.length?n:1);var t=this.r,e=this.g,r=this.b,u=30;return t||e||r?(t&amp;&amp;u&gt;t&amp;&amp;(t=u),e&amp;&amp;u&gt;e&amp;&amp;(e=u),r&amp;&amp;u&gt;r&amp;&amp;(r=u),new gt(Math.min(255,t/n),Math.min(255,e/n),Math.min(255,r/n))):new gt(u,u,u)},Ya.darker=function(n){return n=Math.pow(.7,arguments.length?n:1),new gt(n*this.r,n*this.g,n*this.b)},Ya.hsl=function(){return yt(this.r,this.g,this.b)},Ya.toString=function(){return&quot;#&quot;+dt(this.r)+dt(this.g)+dt(this.b)};var Ia=Zo.map({aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:108
 24234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemo
 nchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:145246
 37,powderblue:11591910,purple:8388736,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074});Ia.forEach(function(n,t){Ia.set(n,pt(t))}),Zo.functor=bt,Zo.xhr=St(wt),Zo.dsv=function(n,t){function e(n,e,i){arguments.length&lt;3&amp;&amp;(i=e,e=null);var o=kt(n,t,null==e?r:u(e),i);return o.row=function(n){return arguments.length?o.response(null==(e=n)?r:u(n)):e},o}function r(n){return e.parse(n.responseText)}function u(n){return function(t){return e.parse(t.responseText,n)}}function i(t){return t.map(o).join(n)}function o(n){return a.test(n)?'&quot;'+n.replace(/\&quot;
 /g,'&quot;&quot;')+'&quot;':n}var a=new RegExp('[&quot;'+n+&quot;\n]&quot;),c=n.charCodeAt(0);return e.parse=function(n,t){var r;return e.parseRows(n,function(n,e){if(r)return r(n,e-1);var u=new Function(&quot;d&quot;,&quot;return {&quot;+n.map(function(n,t){return JSON.stringify(n)+&quot;: d[&quot;+t+&quot;]&quot;}).join(&quot;,&quot;)+&quot;}&quot;);r=t?function(n,e){return t(u(n),e)}:u})},e.parseRows=function(n,t){function e(){if(l&gt;=s)return o;if(u)return u=!1,i;var t=l;if(34===n.charCodeAt(t)){for(var e=t;e++&lt;s;)if(34===n.charCodeAt(e)){if(34!==n.charCodeAt(e+1))break;++e}l=e+2;var r=n.charCodeAt(e+1);return 13===r?(u=!0,10===n.charCodeAt(e+2)&amp;&amp;++l):10===r&amp;&amp;(u=!0),n.substring(t+1,e).replace(/&quot;&quot;/g,'&quot;')}for(;s&gt;l;){var r=n.charCodeAt(l++),a=1;if(10===r)u=!0;else if(13===r)u=!0,10===n.charCodeAt(l)&amp;&amp;(++l,++a);else if(r!==c)continue;return n.substring(t,l-a)}return n.substring(t)}for(var r,u,i={},o={},a=[],s=n.length,l=0,f=0;(r=
 e())!==o;){for(var h=[];r!==i&amp;&amp;r!==o;)h.push(r),r=e();(!t||(h=t(h,f++)))&amp;&amp;a.push(h)}return a},e.format=function(t){if(Array.isArray(t[0]))return e.formatRows(t);var r=new h,u=[];return t.forEach(function(n){for(var t in n)r.has(t)||u.push(r.add(t))}),[u.map(o).join(n)].concat(t.map(function(t){return u.map(function(n){return o(t[n])}).join(n)})).join(&quot;\n&quot;)},e.formatRows=function(n){return n.map(i).join(&quot;\n&quot;)},e},Zo.csv=Zo.dsv(&quot;,&quot;,&quot;text/csv&quot;),Zo.tsv=Zo.dsv(&quot;    &quot;,&quot;text/tab-separated-values&quot;),Zo.touch=function(n,t,e){if(arguments.length&lt;3&amp;&amp;(e=t,t=x().changedTouches),t)for(var r,u=0,i=t.length;i&gt;u;++u)if((r=t[u]).identifier===e)return Z(n,r)};var Za,Va,Xa,$a,Ba,Wa=Wo[p(Wo,&quot;requestAnimationFrame&quot;)]||function(n){setTimeout(n,17)};Zo.timer=function(n,t,e){var r=arguments.length;2&gt;r&amp;&amp;(t=0),3&gt;r&amp;&amp;(e=Date.now());var u=e+t,i={c:n,t:u,f:!1,n:null};Va?Va.n=i:Za=i,Va=i
 ,Xa||($a=clearTimeout($a),Xa=1,Wa(At))},Zo.timer.flush=function(){Ct(),Nt()},Zo.round=function(n,t){return t?Math.round(n*(t=Math.pow(10,t)))/t:Math.round(n)};var Ja=[&quot;y&quot;,&quot;z&quot;,&quot;a&quot;,&quot;f&quot;,&quot;p&quot;,&quot;n&quot;,&quot;\xb5&quot;,&quot;m&quot;,&quot;&quot;,&quot;k&quot;,&quot;M&quot;,&quot;G&quot;,&quot;T&quot;,&quot;P&quot;,&quot;E&quot;,&quot;Z&quot;,&quot;Y&quot;].map(Lt);Zo.formatPrefix=function(n,t){var e=0;return n&amp;&amp;(0&gt;n&amp;&amp;(n*=-1),t&amp;&amp;(n=Zo.round(n,zt(n,t))),e=1+Math.floor(1e-12+Math.log(n)/Math.LN10),e=Math.max(-24,Math.min(24,3*Math.floor((e-1)/3)))),Ja[8+e/3]};var Ga=/(?:([^{])?([&lt;&gt;=^]))?([+\- ])?([$#])?(0)?(\d+)?(,)?(\.-?\d+)?([a-z%])?/i,Ka=Zo.map({b:function(n){return n.toString(2)},c:function(n){return String.fromCharCode(n)},o:function(n){return n.toString(8)},x:function(n){return n.toString(16)},X:function(n){return n.toString(16).toUpperCase()},g:function(n,t){return n.toPrecision(t)},e:funct
 ion(n,t){return n.toExponential(t)},f:function(n,t){return n.toFixed(t)},r:function(n,t){return(n=Zo.round(n,zt(n,t))).toFixed(Math.max(0,Math.min(20,zt(n*(1+1e-15),t))))}}),Qa=Zo.time={},nc=Date;Rt.prototype={getDate:function(){return this._.getUTCDate()},getDay:function(){return this._.getUTCDay()},getFullYear:function(){return this._.getUTCFullYear()},getHours:function(){return this._.getUTCHours()},getMilliseconds:function(){return this._.getUTCMilliseconds()},getMinutes:function(){return this._.getUTCMinutes()},getMonth:function(){return this._.getUTCMonth()},getSeconds:function(){return this._.getUTCSeconds()},getTime:function(){return this._.getTime()},getTimezoneOffset:function(){return 0},valueOf:function(){return this._.valueOf()},setDate:function(){tc.setUTCDate.apply(this._,arguments)},setDay:function(){tc.setUTCDay.apply(this._,arguments)},setFullYear:function(){tc.setUTCFullYear.apply(this._,arguments)},setHours:function(){tc.setUTCHours.apply(this._,arguments)
 },setMilliseconds:function(){tc.setUTCMilliseconds.apply(this._,arguments)},setMinutes:function(){tc.setUTCMinutes.apply(this._,arguments)},setMonth:function(){tc.setUTCMonth.apply(this._,arguments)},setSeconds:function(){tc.setUTCSeconds.apply(this._,arguments)},setTime:function(){tc.setTime.apply(this._,arguments)}};var tc=Date.prototype;Qa.year=Dt(function(n){return n=Qa.day(n),n.setMonth(0,1),n},function(n,t){n.setFullYear(n.getFullYear()+t)},function(n){return n.getFullYear()}),Qa.years=Qa.year.range,Qa.years.utc=Qa.year.utc.range,Qa.day=Dt(function(n){var t=new nc(2e3,0);return t.setFullYear(n.getFullYear(),n.getMonth(),n.getDate()),t},function(n,t){n.setDate(n.getDate()+t)},function(n){return n.getDate()-1}),Qa.days=Qa.day.range,Qa.days.utc=Qa.day.utc.range,Qa.dayOfYear=function(n){var t=Qa.year(n);return Math.floor((n-t-6e4*(n.getTimezoneOffset()-t.getTimezoneOffset()))/864e5)},[&quot;sunday&quot;,&quot;monday&quot;,&quot;tuesday&quot;,&quot;wednesday&quot;,&quot;thu
 rsday&quot;,&quot;friday&quot;,&quot;saturday&quot;].forEach(function(n,t){t=7-t;var e=Qa[n]=Dt(function(n){return(n=Qa.day(n)).setDate(n.getDate()-(n.getDay()+t)%7),n},function(n,t){n.setDate(n.getDate()+7*Math.floor(t))},function(n){var e=Qa.year(n).getDay();return Math.floor((Qa.dayOfYear(n)+(e+t)%7)/7)-(e!==t)});Qa[n+&quot;s&quot;]=e.range,Qa[n+&quot;s&quot;].utc=e.utc.range,Qa[n+&quot;OfYear&quot;]=function(n){var e=Qa.year(n).getDay();return Math.floor((Qa.dayOfYear(n)+(e+t)%7)/7)}}),Qa.week=Qa.sunday,Qa.weeks=Qa.sunday.range,Qa.weeks.utc=Qa.sunday.utc.range,Qa.weekOfYear=Qa.sundayOfYear;var ec={&quot;-&quot;:&quot;&quot;,_:&quot; &quot;,0:&quot;0&quot;},rc=/^\s*\d+/,uc=/^%/;Zo.locale=function(n){return{numberFormat:Tt(n),timeFormat:Ut(n)}};var ic=Zo.locale({decimal:&quot;.&quot;,thousands:&quot;,&quot;,grouping:[3],currency:[&quot;$&quot;,&quot;&quot;],dateTime:&quot;%a %b %e %X %Y&quot;,date:&quot;%m/%d/%Y&quot;,time:&quot;%H:%M:%S&quot;,periods:[&quot;AM&quot;,&quot
 ;PM&quot;],days:[&quot;Sunday&quot;,&quot;Monday&quot;,&quot;Tuesday&quot;,&quot;Wednesday&quot;,&quot;Thursday&quot;,&quot;Friday&quot;,&quot;Saturday&quot;],shortDays:[&quot;Sun&quot;,&quot;Mon&quot;,&quot;Tue&quot;,&quot;Wed&quot;,&quot;Thu&quot;,&quot;Fri&quot;,&quot;Sat&quot;],months:[&quot;January&quot;,&quot;February&quot;,&quot;March&quot;,&quot;April&quot;,&quot;May&quot;,&quot;June&quot;,&quot;July&quot;,&quot;August&quot;,&quot;September&quot;,&quot;October&quot;,&quot;November&quot;,&quot;December&quot;],shortMonths:[&quot;Jan&quot;,&quot;Feb&quot;,&quot;Mar&quot;,&quot;Apr&quot;,&quot;May&quot;,&quot;Jun&quot;,&quot;Jul&quot;,&quot;Aug&quot;,&quot;Sep&quot;,&quot;Oct&quot;,&quot;Nov&quot;,&quot;Dec&quot;]});Zo.format=ic.numberFormat,Zo.geo={},ue.prototype={s:0,t:0,add:function(n){ie(n,this.t,oc),ie(oc.s,this.s,this),this.s?this.t+=oc.t:this.s=oc.t},reset:function(){this.s=this.t=0},valueOf:function(){return this.s}};var oc=new ue;Zo.geo.stream=function(n,t){n&am
 p;&amp;ac.hasOwnProperty(n.type)?ac[n.type](n,t):oe(n,t)};var ac={Feature:function(n,t){oe(n.geometry,t)},FeatureCollection:function(n,t){for(var e=n.features,r=-1,u=e.length;++r&lt;u;)oe(e[r].geometry,t)}},cc={Sphere:function(n,t){t.sphere()},Point:function(n,t){n=n.coordinates,t.point(n[0],n[1],n[2])},MultiPoint:function(n,t){for(var e=n.coordinates,r=-1,u=e.length;++r&lt;u;)n=e[r],t.point(n[0],n[1],n[2])},LineString:function(n,t){ae(n.coordinates,t,0)},MultiLineString:function(n,t){for(var e=n.coordinates,r=-1,u=e.length;++r&lt;u;)ae(e[r],t,0)},Polygon:function(n,t){ce(n.coordinates,t)},MultiPolygon:function(n,t){for(var e=n.coordinates,r=-1,u=e.length;++r&lt;u;)ce(e[r],t)},GeometryCollection:function(n,t){for(var e=n.geometries,r=-1,u=e.length;++r&lt;u;)oe(e[r],t)}};Zo.geo.area=function(n){return sc=0,Zo.geo.stream(n,fc),sc};var sc,lc=new ue,fc={sphere:function(){sc+=4*ba},point:v,lineStart:v,lineEnd:v,polygonStart:function(){lc.reset(),fc.lineStart=se},polygonEnd:functi
 on(){var n=2*lc;sc+=0&gt;n?4*ba+n:n,fc.lineStart=fc.lineEnd=fc.point=v}};Zo.geo.bounds=function(){function n(n,t){x.push(M=[l=n,h=n]),f&gt;t&amp;&amp;(f=t),t&gt;g&amp;&amp;(g=t)}function t(t,e){var r=le([t*Aa,e*Aa]);if(m){var u=he(m,r),i=[u[1],-u[0],0],o=he(i,u);ve(o),o=de(o);var c=t-p,s=c&gt;0?1:-1,v=o[0]*Ca*s,d=ua(c)&gt;180;if(d^(v&gt;s*p&amp;&amp;s*t&gt;v)){var y=o[1]*Ca;y&gt;g&amp;&amp;(g=y)}else if(v=(v+360)%360-180,d^(v&gt;s*p&amp;&amp;s*t&gt;v)){var y=-o[1]*Ca;f&gt;y&amp;&amp;(f=y)}else f&gt;e&amp;&amp;(f=e),e&gt;g&amp;&amp;(g=e);d?p&gt;t?a(l,t)&gt;a(l,h)&amp;&amp;(h=t):a(t,h)&gt;a(l,h)&amp;&amp;(l=t):h&gt;=l?(l&gt;t&amp;&amp;(l=t),t&gt;h&amp;&amp;(h=t)):t&gt;p?a(l,t)&gt;a(l,h)&amp;&amp;(h=t):a(t,h)&gt;a(l,h)&amp;&amp;(l=t)}else n(t,e);m=r,p=t}function e(){_.point=t}function r(){M[0]=l,M[1]=h,_.point=n,m=null}function u(n,e){if(m){var r=n-p;y+=ua(r)&gt;180?r+(r&gt;0?360:-360):r}else v=n,d=e;fc.point(n,e),t(n,e)}function i(){fc.lineStart()}function o(){u(v,d),fc.lineEn
 d(),ua(y)&gt;ka&amp;&amp;(l=-(h=180)),M[0]=l,M[1]=h,m=null}function a(n,t){return(t-=n)&lt;0?t+360:t}function c(n,t){return n[0]-t[0]}function s(n,t){return t[0]&lt;=t[1]?t[0]&lt;=n&amp;&amp;n&lt;=t[1]:n&lt;t[0]||t[1]&lt;n}var l,f,h,g,p,v,d,m,y,x,M,_={point:n,lineStart:e,lineEnd:r,polygonStart:function(){_.point=u,_.lineStart=i,_.lineEnd=o,y=0,fc.polygonStart()},polygonEnd:function(){fc.polygonEnd(),_.point=n,_.lineStart=e,_.lineEnd=r,0&gt;lc?(l=-(h=180),f=-(g=90)):y&gt;ka?g=90:-ka&gt;y&amp;&amp;(f=-90),M[0]=l,M[1]=h}};return function(n){g=h=-(l=f=1/0),x=[],Zo.geo.stream(n,_);var t=x.length;if(t){x.sort(c);for(var e,r=1,u=x[0],i=[u];t&gt;r;++r)e=x[r],s(e[0],u)||s(e[1],u)?(a(u[0],e[1])&gt;a(u[0],u[1])&amp;&amp;(u[1]=e[1]),a(e[0],u[1])&gt;a(u[0],u[1])&amp;&amp;(u[0]=e[0])):i.push(u=e);
+for(var o,e,p=-1/0,t=i.length-1,r=0,u=i[t];t&gt;=r;u=e,++r)e=i[r],(o=a(u[1],e[0]))&gt;p&amp;&amp;(p=o,l=e[0],h=u[1])}return x=M=null,1/0===l||1/0===f?[[0/0,0/0],[0/0,0/0]]:[[l,f],[h,g]]}}(),Zo.geo.centroid=function(n){hc=gc=pc=vc=dc=mc=yc=xc=Mc=_c=bc=0,Zo.geo.stream(n,wc);var t=Mc,e=_c,r=bc,u=t*t+e*e+r*r;return Ea&gt;u&amp;&amp;(t=mc,e=yc,r=xc,ka&gt;gc&amp;&amp;(t=pc,e=vc,r=dc),u=t*t+e*e+r*r,Ea&gt;u)?[0/0,0/0]:[Math.atan2(e,t)*Ca,G(r/Math.sqrt(u))*Ca]};var hc,gc,pc,vc,dc,mc,yc,xc,Mc,_c,bc,wc={sphere:v,point:ye,lineStart:Me,lineEnd:_e,polygonStart:function(){wc.lineStart=be},polygonEnd:function(){wc.lineStart=Me}},Sc=Ae(we,Te,Re,[-ba,-ba/2]),kc=1e9;Zo.geo.clipExtent=function(){var n,t,e,r,u,i,o={stream:function(n){return u&amp;&amp;(u.valid=!1),u=i(n),u.valid=!0,u},extent:function(a){return arguments.length?(i=Ue(n=+a[0][0],t=+a[0][1],e=+a[1][0],r=+a[1][1]),u&amp;&amp;(u.valid=!1,u=null),o):[[n,t],[e,r]]}};return o.extent([[0,0],[960,500]])},(Zo.geo.conicEqualArea=function(){
 return He(Fe)}).raw=Fe,Zo.geo.albers=function(){return Zo.geo.conicEqualArea().rotate([96,0]).center([-.6,38.7]).parallels([29.5,45.5]).scale(1070)},Zo.geo.albersUsa=function(){function n(n){var i=n[0],o=n[1];return t=null,e(i,o),t||(r(i,o),t)||u(i,o),t}var t,e,r,u,i=Zo.geo.albers(),o=Zo.geo.conicEqualArea().rotate([154,0]).center([-2,58.5]).parallels([55,65]),a=Zo.geo.conicEqualArea().rotate([157,0]).center([-3,19.9]).parallels([8,18]),c={point:function(n,e){t=[n,e]}};return n.invert=function(n){var t=i.scale(),e=i.translate(),r=(n[0]-e[0])/t,u=(n[1]-e[1])/t;return(u&gt;=.12&amp;&amp;.234&gt;u&amp;&amp;r&gt;=-.425&amp;&amp;-.214&gt;r?o:u&gt;=.166&amp;&amp;.234&gt;u&amp;&amp;r&gt;=-.214&amp;&amp;-.115&gt;r?a:i).invert(n)},n.stream=function(n){var t=i.stream(n),e=o.stream(n),r=a.stream(n);return{point:function(n,u){t.point(n,u),e.point(n,u),r.point(n,u)},sphere:function(){t.sphere(),e.sphere(),r.sphere()},lineStart:function(){t.lineStart(),e.lineStart(),r.lineStart()},lineEnd
 :function(){t.lineEnd(),e.lineEnd(),r.lineEnd()},polygonStart:function(){t.polygonStart(),e.polygonStart(),r.polygonStart()},polygonEnd:function(){t.polygonEnd(),e.polygonEnd(),r.polygonEnd()}}},n.precision=function(t){return arguments.length?(i.precision(t),o.precision(t),a.precision(t),n):i.precision()},n.scale=function(t){return arguments.length?(i.scale(t),o.scale(.35*t),a.scale(t),n.translate(i.translate())):i.scale()},n.translate=function(t){if(!arguments.length)return i.translate();var s=i.scale(),l=+t[0],f=+t[1];return e=i.translate(t).clipExtent([[l-.455*s,f-.238*s],[l+.455*s,f+.238*s]]).stream(c).point,r=o.translate([l-.307*s,f+.201*s]).clipExtent([[l-.425*s+ka,f+.12*s+ka],[l-.214*s-ka,f+.234*s-ka]]).stream(c).point,u=a.translate([l-.205*s,f+.212*s]).clipExtent([[l-.214*s+ka,f+.166*s+ka],[l-.115*s-ka,f+.234*s-ka]]).stream(c).point,n},n.scale(1070)};var Ec,Ac,Cc,Nc,zc,Lc,Tc={point:v,lineStart:v,lineEnd:v,polygonStart:function(){Ac=0,Tc.lineStart=Oe},polygonEnd:funct
 ion(){Tc.lineStart=Tc.lineEnd=Tc.point=v,Ec+=ua(Ac/2)}},qc={point:Ye,lineStart:v,lineEnd:v,polygonStart:v,polygonEnd:v},Rc={point:Ve,lineStart:Xe,lineEnd:$e,polygonStart:function(){Rc.lineStart=Be},polygonEnd:function(){Rc.point=Ve,Rc.lineStart=Xe,Rc.lineEnd=$e}};Zo.geo.path=function(){function n(n){return n&amp;&amp;(&quot;function&quot;==typeof a&amp;&amp;i.pointRadius(+a.apply(this,arguments)),o&amp;&amp;o.valid||(o=u(i)),Zo.geo.stream(n,o)),i.result()}function t(){return o=null,n}var e,r,u,i,o,a=4.5;return n.area=function(n){return Ec=0,Zo.geo.stream(n,u(Tc)),Ec},n.centroid=function(n){return pc=vc=dc=mc=yc=xc=Mc=_c=bc=0,Zo.geo.stream(n,u(Rc)),bc?[Mc/bc,_c/bc]:xc?[mc/xc,yc/xc]:dc?[pc/dc,vc/dc]:[0/0,0/0]},n.bounds=function(n){return zc=Lc=-(Cc=Nc=1/0),Zo.geo.stream(n,u(qc)),[[Cc,Nc],[zc,Lc]]},n.projection=function(n){return arguments.length?(u=(e=n)?n.stream||Ge(n):wt,t()):e},n.context=function(n){return arguments.length?(i=null==(r=n)?new Ie:new We(n),&quot;function&quot
 ;!=typeof a&amp;&amp;i.pointRadius(a),t()):r},n.pointRadius=function(t){return arguments.length?(a=&quot;function&quot;==typeof t?t:(i.pointRadius(+t),+t),n):a},n.projection(Zo.geo.albersUsa()).context(null)},Zo.geo.transform=function(n){return{stream:function(t){var e=new Ke(t);for(var r in n)e[r]=n[r];return e}}},Ke.prototype={point:function(n,t){this.stream.point(n,t)},sphere:function(){this.stream.sphere()},lineStart:function(){this.stream.lineStart()},lineEnd:function(){this.stream.lineEnd()},polygonStart:function(){this.stream.polygonStart()},polygonEnd:function(){this.stream.polygonEnd()}},Zo.geo.projection=nr,Zo.geo.projectionMutator=tr,(Zo.geo.equirectangular=function(){return nr(rr)}).raw=rr.invert=rr,Zo.geo.rotation=function(n){function t(t){return t=n(t[0]*Aa,t[1]*Aa),t[0]*=Ca,t[1]*=Ca,t}return n=ir(n[0]%360*Aa,n[1]*Aa,n.length&gt;2?n[2]*Aa:0),t.invert=function(t){return t=n.invert(t[0]*Aa,t[1]*Aa),t[0]*=Ca,t[1]*=Ca,t},t},ur.invert=rr,Zo.geo.circle=function(){fun
 ction n(){var n=&quot;function&quot;==typeof r?r.apply(this,arguments):r,t=ir(-n[0]*Aa,-n[1]*Aa,0).invert,u=[];return e(null,null,1,{point:function(n,e){u.push(n=t(n,e)),n[0]*=Ca,n[1]*=Ca}}),{type:&quot;Polygon&quot;,coordinates:[u]}}var t,e,r=[0,0],u=6;return n.origin=function(t){return arguments.length?(r=t,n):r},n.angle=function(r){return arguments.length?(e=sr((t=+r)*Aa,u*Aa),n):t},n.precision=function(r){return arguments.length?(e=sr(t*Aa,(u=+r)*Aa),n):u},n.angle(90)},Zo.geo.distance=function(n,t){var e,r=(t[0]-n[0])*Aa,u=n[1]*Aa,i=t[1]*Aa,o=Math.sin(r),a=Math.cos(r),c=Math.sin(u),s=Math.cos(u),l=Math.sin(i),f=Math.cos(i);return Math.atan2(Math.sqrt((e=f*o)*e+(e=s*l-c*f*a)*e),c*l+s*f*a)},Zo.geo.graticule=function(){function n(){return{type:&quot;MultiLineString&quot;,coordinates:t()}}function t(){return Zo.range(Math.ceil(i/d)*d,u,d).map(h).concat(Zo.range(Math.ceil(s/m)*m,c,m).map(g)).concat(Zo.range(Math.ceil(r/p)*p,e,p).filter(function(n){return ua(n%d)&gt;ka}).map(l
 )).concat(Zo.range(Math.ceil(a/v)*v,o,v).filter(function(n){return ua(n%m)&gt;ka}).map(f))}var e,r,u,i,o,a,c,s,l,f,h,g,p=10,v=p,d=90,m=360,y=2.5;return n.lines=function(){return t().map(function(n){return{type:&quot;LineString&quot;,coordinates:n}})},n.outline=function(){return{type:&quot;Polygon&quot;,coordinates:[h(i).concat(g(c).slice(1),h(u).reverse().slice(1),g(s).reverse().slice(1))]}},n.extent=function(t){return arguments.length?n.majorExtent(t).minorExtent(t):n.minorExtent()},n.majorExtent=function(t){return arguments.length?(i=+t[0][0],u=+t[1][0],s=+t[0][1],c=+t[1][1],i&gt;u&amp;&amp;(t=i,i=u,u=t),s&gt;c&amp;&amp;(t=s,s=c,c=t),n.precision(y)):[[i,s],[u,c]]},n.minorExtent=function(t){return arguments.length?(r=+t[0][0],e=+t[1][0],a=+t[0][1],o=+t[1][1],r&gt;e&amp;&amp;(t=r,r=e,e=t),a&gt;o&amp;&amp;(t=a,a=o,o=t),n.precision(y)):[[r,a],[e,o]]},n.step=function(t){return arguments.length?n.majorStep(t).minorStep(t):n.minorStep()},n.majorStep=function(t){return arguments.l
 ength?(d=+t[0],m=+t[1],n):[d,m]},n.minorStep=function(t){return arguments.length?(p=+t[0],v=+t[1],n):[p,v]},n.precision=function(t){return arguments.length?(y=+t,l=fr(a,o,90),f=hr(r,e,y),h=fr(s,c,90),g=hr(i,u,y),n):y},n.majorExtent([[-180,-90+ka],[180,90-ka]]).minorExtent([[-180,-80-ka],[180,80+ka]])},Zo.geo.greatArc=function(){function n(){return{type:&quot;LineString&quot;,coordinates:[t||r.apply(this,arguments),e||u.apply(this,arguments)]}}var t,e,r=gr,u=pr;return n.distance=function(){return Zo.geo.distance(t||r.apply(this,arguments),e||u.apply(this,arguments))},n.source=function(e){return arguments.length?(r=e,t=&quot;function&quot;==typeof e?null:e,n):r},n.target=function(t){return arguments.length?(u=t,e=&quot;function&quot;==typeof t?null:t,n):u},n.precision=function(){return arguments.length?n:0},n},Zo.geo.interpolate=function(n,t){return vr(n[0]*Aa,n[1]*Aa,t[0]*Aa,t[1]*Aa)},Zo.geo.length=function(n){return Dc=0,Zo.geo.stream(n,Pc),Dc};var Dc,Pc={sphere:v,point:v,li
 neStart:dr,lineEnd:v,polygonStart:v,polygonEnd:v},Uc=mr(function(n){return Math.sqrt(2/(1+n))},function(n){return 2*Math.asin(n/2)});(Zo.geo.azimuthalEqualArea=function(){return nr(Uc)}).raw=Uc;var jc=mr(function(n){var t=Math.acos(n);return t&amp;&amp;t/Math.sin(t)},wt);(Zo.geo.azimuthalEquidistant=function(){return nr(jc)}).raw=jc,(Zo.geo.conicConformal=function(){return He(yr)}).raw=yr,(Zo.geo.conicEquidistant=function(){return He(xr)}).raw=xr;var Hc=mr(function(n){return 1/n},Math.atan);(Zo.geo.gnomonic=function(){return nr(Hc)}).raw=Hc,Mr.invert=function(n,t){return[n,2*Math.atan(Math.exp(t))-Sa]},(Zo.geo.mercator=function(){return _r(Mr)}).raw=Mr;var Fc=mr(function(){return 1},Math.asin);(Zo.geo.orthographic=function(){return nr(Fc)}).raw=Fc;var Oc=mr(function(n){return 1/(1+n)},function(n){return 2*Math.atan(n)});(Zo.geo.stereographic=function(){return nr(Oc)}).raw=Oc,br.invert=function(n,t){return[-t,2*Math.atan(Math.exp(n))-Sa]},(Zo.geo.transverseMercator=function()
 {var n=_r(br),t=n.center,e=n.rotate;return n.center=function(n){return n?t([-n[1],n[0]]):(n=t(),[n[1],-n[0]])},n.rotate=function(n){return n?e([n[0],n[1],n.length&gt;2?n[2]+90:90]):(n=e(),[n[0],n[1],n[2]-90])},e([0,0,90])}).raw=br,Zo.geom={},Zo.geom.hull=function(n){function t(n){if(n.length&lt;3)return[];var t,u=bt(e),i=bt(r),o=n.length,a=[],c=[];for(t=0;o&gt;t;t++)a.push([+u.call(this,n[t],t),+i.call(this,n[t],t),t]);for(a.sort(Er),t=0;o&gt;t;t++)c.push([a[t][0],-a[t][1]]);var s=kr(a),l=kr(c),f=l[0]===s[0],h=l[l.length-1]===s[s.length-1],g=[];for(t=s.length-1;t&gt;=0;--t)g.push(n[a[s[t]][2]]);for(t=+f;t&lt;l.length-h;++t)g.push(n[a[l[t]][2]]);return g}var e=wr,r=Sr;return arguments.length?t(n):(t.x=function(n){return arguments.length?(e=n,t):e},t.y=function(n){return arguments.length?(r=n,t):r},t)},Zo.geom.polygon=function(n){return sa(n,Yc),n};var Yc=Zo.geom.polygon.prototype=[];Yc.area=function(){for(var n,t=-1,e=this.length,r=this[e-1],u=0;++t&lt;e;)n=r,r=this[t],u+=n[1
 ]*r[0]-n[0]*r[1];return.5*u},Yc.centroid=function(n){var t,e,r=-1,u=this.length,i=0,o=0,a=this[u-1];for(arguments.length||(n=-1/(6*this.area()));++r&lt;u;)t=a,a=this[r],e=t[0]*a[1]-a[0]*t[1],i+=(t[0]+a[0])*e,o+=(t[1]+a[1])*e;return[i*n,o*n]},Yc.clip=function(n){for(var t,e,r,u,i,o,a=Nr(n),c=-1,s=this.length-Nr(this),l=this[s-1];++c&lt;s;){for(t=n.slice(),n.length=0,u=this[c],i=t[(r=t.length-a)-1],e=-1;++e&lt;r;)o=t[e],Ar(o,l,u)?(Ar(i,l,u)||n.push(Cr(i,o,l,u)),n.push(o)):Ar(i,l,u)&amp;&amp;n.push(Cr(i,o,l,u)),i=o;a&amp;&amp;n.push(n[0]),l=u}return n};var Ic,Zc,Vc,Xc,$c,Bc=[],Wc=[];Ur.prototype.prepare=function(){for(var n,t=this.edges,e=t.length;e--;)n=t[e].edge,n.b&amp;&amp;n.a||t.splice(e,1);return t.sort(Hr),t.length},Wr.prototype={start:function(){return this.edge.l===this.site?this.edge.a:this.edge.b},end:function(){return this.edge.l===this.site?this.edge.b:this.edge.a}},Jr.prototype={insert:function(n,t){var e,r,u;if(n){if(t.P=n,t.N=n.N,n.N&amp;&amp;(n.N.P=t),n.N=t,n.R
 ){for(n=n.R;n.L;)n=n.L;n.L=t}else n.R=t;e=n}else this._?(n=nu(this._),t.P=null,t.N=n,n.P=n.L=t,e=n):(t.P=t.N=null,this._=t,e=null);for(t.L=t.R=null,t.U=e,t.C=!0,n=t;e&amp;&amp;e.C;)r=e.U,e===r.L?(u=r.R,u&amp;&amp;u.C?(e.C=u.C=!1,r.C=!0,n=r):(n===e.R&amp;&amp;(Kr(this,e),n=e,e=n.U),e.C=!1,r.C=!0,Qr(this,r))):(u=r.L,u&amp;&amp;u.C?(e.C=u.C=!1,r.C=!0,n=r):(n===e.L&amp;&amp;(Qr(this,e),n=e,e=n.U),e.C=!1,r.C=!0,Kr(this,r))),e=n.U;this._.C=!1},remove:function(n){n.N&amp;&amp;(n.N.P=n.P),n.P&amp;&amp;(n.P.N=n.N),n.N=n.P=null;var t,e,r,u=n.U,i=n.L,o=n.R;if(e=i?o?nu(o):i:o,u?u.L===n?u.L=e:u.R=e:this._=e,i&amp;&amp;o?(r=e.C,e.C=n.C,e.L=i,i.U=e,e!==o?(u=e.U,e.U=n.U,n=e.R,u.L=n,e.R=o,o.U=e):(e.U=u,u=e,n=e.R)):(r=n.C,n=e),n&amp;&amp;(n.U=u),!r){if(n&amp;&amp;n.C)return n.C=!1,void 0;do{if(n===this._)break;if(n===u.L){if(t=u.R,t.C&amp;&amp;(t.C=!1,u.C=!0,Kr(this,u),t=u.R),t.L&amp;&amp;t.L.C||t.R&amp;&amp;t.R.C){t.R&amp;&amp;t.R.C||(t.L.C=!1,t.C=!0,Qr(this,t),t=u.R),t.C=u.C,u.C=t.R.C=!1,Kr
 (this,u),n=this._;break}}else if(t=u.L,t.C&amp;&amp;(t.C=!1,u.C=!0,Qr(this,u),t=u.L),t.L&amp;&amp;t.L.C||t.R&amp;&amp;t.R.C){t.L&amp;&amp;t.L.C||(t.R.C=!1,t.C=!0,Kr(this,t),t=u.L),t.C=u.C,u.C=t.L.C=!1,Qr(this,u),n=this._;break}t.C=!0,n=u,u=u.U}while(!n.C);n&amp;&amp;(n.C=!1)}}},Zo.geom.voronoi=function(n){function t(n){var t=new Array(n.length),r=a[0][0],u=a[0][1],i=a[1][0],o=a[1][1];return tu(e(n),a).cells.forEach(function(e,a){var c=e.edges,s=e.site,l=t[a]=c.length?c.map(function(n){var t=n.start();return[t.x,t.y]}):s.x&gt;=r&amp;&amp;s.x&lt;=i&amp;&amp;s.y&gt;=u&amp;&amp;s.y&lt;=o?[[r,o],[i,o],[i,u],[r,u]]:[];l.point=n[a]}),t}function e(n){return n.map(function(n,t){return{x:Math.round(i(n,t)/ka)*ka,y:Math.round(o(n,t)/ka)*ka,i:t}})}var r=wr,u=Sr,i=r,o=u,a=Jc;return n?t(n):(t.links=function(n){return tu(e(n)).edges.filter(function(n){return n.l&amp;&amp;n.r}).map(function(t){return{source:n[t.l.i],target:n[t.r.i]}})},t.triangles=function(n){var t=[];return tu(e(n)).cells.
 forEach(function(e,r){for(var u,i,o=e.site,a=e.edges.sort(Hr),c=-1,s=a.length,l=a[s-1].edge,f=l.l===o?l.r:l.l;++c&lt;s;)u=l,i=f,l=a[c].edge,f=l.l===o?l.r:l.l,r&lt;i.i&amp;&amp;r&lt;f.i&amp;&amp;ru(o,i,f)&lt;0&amp;&amp;t.push([n[r],n[i.i],n[f.i]])}),t},t.x=function(n){return arguments.length?(i=bt(r=n),t):r},t.y=function(n){return arguments.length?(o=bt(u=n),t):u},t.clipExtent=function(n){return arguments.length?(a=null==n?Jc:n,t):a===Jc?null:a},t.size=function(n){return arguments.length?t.clipExtent(n&amp;&amp;[[0,0],n]):a===Jc?null:a&amp;&amp;a[1]},t)};var Jc=[[-1e6,-1e6],[1e6,1e6]];Zo.geom.delaunay=function(n){return Zo.geom.voronoi().triangles(n)},Zo.geom.quadtree=function(n,t,e,r,u){function i(n){function i(n,t,e,r,u,i,o,a){if(!isNaN(e)&amp;&amp;!isNaN(r))if(n.leaf){var c=n.x,l=n.y;if(null!=c)if(ua(c-e)+ua(l-r)&lt;.01)s(n,t,e,r,u,i,o,a);else{var f=n.point;n.x=n.y=n.point=null,s(n,f,c,l,u,i,o,a),s(n,t,e,r,u,i,o,a)}else n.x=e,n.y=r,n.point=t}else s(n,t,e,r,u,i,o,a)}functio
 n s(n,t,e,r,u,o,a,c){var s=.5*(u+a),l=.5*(o+c),f=e&gt;=s,h=r&gt;=l,g=(h&lt;&lt;1)+f;n.leaf=!1,n=n.nodes[g]||(n.nodes[g]=ou()),f?u=s:a=s,h?o=l:c=l,i(n,t,e,r,u,o,a,c)}var l,f,h,g,p,v,d,m,y,x=bt(a),M=bt(c);if(null!=t)v=t,d=e,m=r,y=u;else if(m=y=-(v=d=1/0),f=[],h=[],p=n.length,o)for(g=0;p&gt;g;++g)l=n[g],l.x&lt;v&amp;&amp;(v=l.x),l.y&lt;d&amp;&amp;(d=l.y),l.x&gt;m&amp;&amp;(m=l.x),l.y&gt;y&amp;&amp;(y=l.y),f.push(l.x),h.push(l.y);else for(g=0;p&gt;g;++g){var _=+x(l=n[g],g),b=+M(l,g);v&gt;_&amp;&amp;(v=_),d&gt;b&amp;&amp;(d=b),_&gt;m&amp;&amp;(m=_),b&gt;y&amp;&amp;(y=b),f.push(_),h.push(b)}var w=m-v,S=y-d;w&gt;S?y=d+w:m=v+S;var k=ou();if(k.add=function(n){i(k,n,+x(n,++g),+M(n,g),v,d,m,y)},k.visit=function(n){au(n,k,v,d,m,y)},g=-1,null==t){for(;++g&lt;p;)i(k,n[g],f[g],h[g],v,d,m,y);--g}else n.forEach(k.add);return f=h=n=l=null,k}var o,a=wr,c=Sr;return(o=arguments.length)?(a=uu,c=iu,3===o&amp;&amp;(u=e,r=t,e=t=0),i(n)):(i.x=function(n){return arguments.length?(a=n,i):a},i.y=functio
 n(n){return arguments.length?(c=n,i):c},i.extent=function(n){return arguments.length?(null==n?t=e=r=u=null:(t=+n[0][0],e=+n[0][1],r=+n[1][0],u=+n[1][1]),i):null==t?null:[[t,e],[r,u]]},i.size=function(n){return arguments.length?(null==n?t=e=r=u=null:(t=e=0,r=+n[0],u=+n[1]),i):null==t?null:[r-t,u-e]},i)},Zo.interpolateRgb=cu,Zo.interpolateObject=su,Zo.interpolateNumber=lu,Zo.interpolateString=fu;var Gc=/[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g,Kc=new RegExp(Gc.source,&quot;g&quot;);Zo.interpolate=hu,Zo.interpolators=[function(n,t){var e=typeof t;return(&quot;string&quot;===e?Ia.has(t)||/^(#|rgb\(|hsl\()/.test(t)?cu:fu:t instanceof et?cu:Array.isArray(t)?gu:&quot;object&quot;===e&amp;&amp;isNaN(t)?su:lu)(n,t)}],Zo.interpolateArray=gu;var Qc=function(){return wt},ns=Zo.map({linear:Qc,poly:Mu,quad:function(){return mu},cubic:function(){return yu},sin:function(){return _u},exp:function(){return bu},circle:function(){return wu},elastic:Su,back:ku,bounce:function(){return Eu}}),
 ts=Zo.map({&quot;in&quot;:wt,out:vu,&quot;in-out&quot;:du,&quot;out-in&quot;:function(n){return du(vu(n))}});Zo.ease=function(n){var t=n.indexOf(&quot;-&quot;),e=t&gt;=0?n.substring(0,t):n,r=t&gt;=0?n.substring(t+1):&quot;in&quot;;return e=ns.get(e)||Qc,r=ts.get(r)||wt,pu(r(e.apply(null,Vo.call(arguments,1))))},Zo.interpolateHcl=Au,Zo.interpolateHsl=Cu,Zo.interpolateLab=Nu,Zo.interpolateRound=zu,Zo.transform=function(n){var t=$o.createElementNS(Zo.ns.prefix.svg,&quot;g&quot;);return(Zo.transform=function(n){if(null!=n){t.setAttribute(&quot;transform&quot;,n);var e=t.transform.baseVal.consolidate()}return new Lu(e?e.matrix:es)})(n)},Lu.prototype.toString=function(){return&quot;translate(&quot;+this.translate+&quot;)rotate(&quot;+this.rotate+&quot;)skewX(&quot;+this.skew+&quot;)scale(&quot;+this.scale+&quot;)&quot;};var es={a:1,b:0,c:0,d:1,e:0,f:0};Zo.interpolateTransform=Du,Zo.layout={},Zo.layout.bundle=function(){return function(n){for(var t=[],e=-1,r=n.length;++e&lt;r;)t.pu
 sh(ju(n[e]));return t}},Zo.layout.chord=function(){function n(){var n,s,f,h,g,p={},v=[],d=Zo.range(i),m=[];for(e=[],r=[],n=0,h=-1;++h&lt;i;){for(s=0,g=-1;++g&lt;i;)s+=u[h][g];v.push(s),m.push(Zo.range(i)),n+=s}for(o&amp;&amp;d.sort(function(n,t){return o(v[n],v[t])}),a&amp;&amp;m.forEach(function(n,t){n.sort(function(n,e){return a(u[t][n],u[t][e])})}),n=(wa-l*i)/n,s=0,h=-1;++h&lt;i;){for(f=s,g=-1;++g&lt;i;){var y=d[h],x=m[y][g],M=u[y][x],_=s,b=s+=M*n;p[y+&quot;-&quot;+x]={index:y,subindex:x,startAngle:_,endAngle:b,value:M}}r[y]={index:y,startAngle:f,endAngle:s,value:(s-f)/n},s+=l}for(h=-1;++h&lt;i;)for(g=h-1;++g&lt;i;){var w=p[h+&quot;-&quot;+g],S=p[g+&quot;-&quot;+h];(w.value||S.value)&amp;&amp;e.push(w.value&lt;S.value?{source:S,target:w}:{source:w,target:S})}c&amp;&amp;t()}function t(){e.sort(function(n,t){return c((n.source.value+n.target.value)/2,(t.source.value+t.target.value)/2)})}var e,r,u,i,o,a,c,s={},l=0;return s.matrix=function(n){return arguments.length?(i=(u=n)&
 amp;&amp;u.length,e=r=null,s):u},s.padding=function(n){return arguments.length?(l=n,e=r=null,s):l},s.sortGroups=function(n){return arguments.length?(o=n,e=r=null,s):o},s.sortSubgroups=function(n){return arguments.length?(a=n,e=null,s):a},s.sortChords=function(n){return arguments.length?(c=n,e&amp;&amp;t(),s):c},s.chords=function(){return e||n(),e},s.groups=function(){return r||n(),r},s},Zo.layout.force=function(){function n(n){return function(t,e,r,u){if(t.point!==n){var i=t.cx-n.x,o=t.cy-n.y,a=u-e,c=i*i+o*o;if(c&gt;a*a/d){if(p&gt;c){var s=t.charge/c;n.px-=i*s,n.py-=o*s}return!0}if(t.point&amp;&amp;c&amp;&amp;p&gt;c){var s=t.pointCharge/c;n.px-=i*s,n.py-=o*s}}return!t.charge}}function t(n){n.px=Zo.event.x,n.py=Zo.event.y,a.resume()}var e,r,u,i,o,a={},c=Zo.dispatch(&quot;start&quot;,&quot;tick&quot;,&quot;end&quot;),s=[1,1],l=.9,f=rs,h=us,g=-30,p=is,v=.1,d=.64,m=[],y=[];return a.tick=function(){if((r*=.99)&lt;.005)return c.end({type:&quot;end&quot;,alpha:r=0}),!0;var t,e,a,f,
 h,p,d,x,M,_=m.length,b=y.length;for(e=0;b&gt;e;++e)a=y[e],f=a.source,h=a.target,x=h.x-f.x,M=h.y-f.y,(p=x*x+M*M)&amp;&amp;(p=r*i[e]*((p=Math.sqrt(p))-u[e])/p,x*=p,M*=p,h.x-=x*(d=f.weight/(h.weight+f.weight)),h.y-=M*d,f.x+=x*(d=1-d),f.y+=M*d);if((d=r*v)&amp;&amp;(x=s[0]/2,M=s[1]/2,e=-1,d))for(;++e&lt;_;)a=m[e],a.x+=(x-a.x)*d,a.y+=(M-a.y)*d;if(g)for(Vu(t=Zo.geom.quadtree(m),r,o),e=-1;++e&lt;_;)(a=m[e]).fixed||t.visit(n(a));for(e=-1;++e&lt;_;)a=m[e],a.fixed?(a.x=a.px,a.y=a.py):(a.x-=(a.px-(a.px=a.x))*l,a.y-=(a.py-(a.py=a.y))*l);c.tick({type:&quot;tick&quot;,alpha:r})},a.nodes=function(n){return arguments.length?(m=n,a):m},a.links=function(n){return arguments.length?(y=n,a):y},a.size=function(n){return arguments.length?(s=n,a):s},a.linkDistance=function(n){return arguments.length?(f=&quot;function&quot;==typeof n?n:+n,a):f},a.distance=a.linkDistance,a.linkStrength=function(n){return arguments.length?(h=&quot;function&quot;==typeof n?n:+n,a):h},a.friction=function(n){return argume
 nts.length?(l=+n,a):l},a.charge=function(n){return arguments.length?(g=&quot;function&quot;==typeof n?n:+n,a):g},a.chargeDistance=function(n){return arguments.length?(p=n*n,a):Math.sqrt(p)},a.gravity=function(n){return arguments.length?(v=+n,a):v},a.theta=function(n){return arguments.length?(d=n*n,a):Math.sqrt(d)},a.alpha=function(n){return arguments.length?(n=+n,r?r=n&gt;0?n:0:n&gt;0&amp;&amp;(c.start({type:&quot;start&quot;,alpha:r=n}),Zo.timer(a.tick)),a):r},a.start=function(){function n(n,r){if(!e){for(e=new Array(c),a=0;c&gt;a;++a)e[a]=[];for(a=0;s&gt;a;++a){var u=y[a];e[u.source.index].push(u.target),e[u.target.index].push(u.source)}}for(var i,o=e[t],a=-1,s=o.length;++a&lt;s;)if(!isNaN(i=o[a][n]))return i;return Math.random()*r}var t,e,r,c=m.length,l=y.length,p=s[0],v=s[1];for(t=0;c&gt;t;++t)(r=m[t]).index=t,r.weight=0;for(t=0;l&gt;t;++t)r=y[t],&quot;number&quot;==typeof r.source&amp;&amp;(r.source=m[r.source]),&quot;number&quot;==typeof r.target&amp;&amp;(r.target=m[r
 .target]),++r.source.weight,++r.target.weight;for(t=0;c&gt;t;++t)r=m[t],isNaN(r.x)&amp;&amp;(r.x=n(&quot;x&quot;,p)),isNaN(r.y)&amp;&amp;(r.y=n(&quot;y&quot;,v)),isNaN(r.px)&amp;&amp;(r.px=r.x),isNaN(r.py)&amp;&amp;(r.py=r.y);if(u=[],&quot;function&quot;==typeof f)for(t=0;l&gt;t;++t)u[t]=+f.call(this,y[t],t);else for(t=0;l&gt;t;++t)u[t]=f;if(i=[],&quot;function&quot;==typeof h)for(t=0;l&gt;t;++t)i[t]=+h.call(this,y[t],t);else for(t=0;l&gt;t;++t)i[t]=h;if(o=[],&quot;function&quot;==typeof g)for(t=0;c&gt;t;++t)o[t]=+g.call(this,m[t],t);else for(t=0;c&gt;t;++t)o[t]=g;return a.resume()},a.resume=function(){return a.alpha(.1)},a.stop=function(){return a.alpha(0)},a.drag=function(){return e||(e=Zo.behavior.drag().origin(wt).on(&quot;dragstart.force&quot;,Ou).on(&quot;drag.force&quot;,t).on(&quot;dragend.force&quot;,Yu)),arguments.length?(this.on(&quot;mouseover.force&quot;,Iu).on(&quot;mouseout.force&quot;,Zu).call(e),void 0):e},Zo.rebind(a,c,&quot;on&quot;)};var rs=20,us=1,is=1/0
 ;Zo.layout.hierarchy=function(){function n(u){var i,o=[u],a=[];for(u.depth=0;null!=(i=o.pop());)if(a.push(i),(s=e.call(n,i,i.depth))&amp;&amp;(c=s.length)){for(var c,s,l;--c&gt;=0;)o.push(l=s[c]),l.parent=i,l.depth=i.depth+1;r&amp;&amp;(i.value=0),i.children=s}else r&amp;&amp;(i.value=+r.call(n,i,i.depth)||0),delete i.children;return Bu(u,function(n){var e,u;t&amp;&amp;(e=n.children)&amp;&amp;e.sort(t),r&amp;&amp;(u=n.parent)&amp;&amp;(u.value+=n.value)}),a}var t=Gu,e=Wu,r=Ju;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&amp;&amp;($u(t,function(n){n.children&amp;&amp;(n.value=0)}),Bu(t,function(t){var e;t.children||(t.value=+r.call(n,t,t.depth)||0),(e=t.parent)&amp;&amp;(e.value+=t.value)})),t},n},Zo.layout.partition=function(){function n(t,e,r,u){var i=t.children;if(t.x=e,t.y=t.depth*u,t.dx=r,t.dy=u,i&amp;&amp;(o=i.le
 ngth)){var o,a,c,s=-1;for(r=t.value?r/t.value:0;++s&lt;o;)n(a=i[s],e,c=a.value*r,u),e+=c}}function t(n){var e=n.children,r=0;if(e&amp;&amp;(u=e.length))for(var u,i=-1;++i&lt;u;)r=Math.max(r,t(e[i]));return 1+r}function e(e,i){var o=r.call(this,e,i);return n(o[0],0,u[0],u[1]/t(o[0])),o}var r=Zo.layout.hierarchy(),u=[1,1];return e.size=function(n){return arguments.length?(u=n,e):u},Xu(e,r)},Zo.layout.pie=function(){function n(i){var o=i.map(function(e,r){return+t.call(n,e,r)}),a=+(&quot;function&quot;==typeof r?r.apply(this,arguments):r),c=((&quot;function&quot;==typeof u?u.apply(this,arguments):u)-a)/Zo.sum(o),s=Zo.range(i.length);null!=e&amp;&amp;s.sort(e===os?function(n,t){return o[t]-o[n]}:function(n,t){return e(i[n],i[t])});var l=[];return s.forEach(function(n){var t;l[n]={data:i[n],value:t=o[n],startAngle:a,endAngle:a+=t*c}}),l}var t=Number,e=os,r=0,u=wa;return n.value=function(e){return arguments.length?(t=e,n):t},n.sort=function(t){return arguments.length?(e=t,n):e},n.
 startAngle=function(t){return arguments.length?(r=t,n):r},n.endAngle=function(t){return arguments.length?(u=t,n):u},n};var os={};Zo.layout.stack=function(){function n(a,c){var s=a.map(function(e,r){return t.call(n,e,r)}),l=s.map(function(t){return t.map(function(t,e){return[i.call(n,t,e),o.call(n,t,e)]})}),f=e.call(n,l,c);s=Zo.permute(s,f),l=Zo.permute(l,f);var h,g,p,v=r.call(n,l,c),d=s.length,m=s[0].length;for(g=0;m&gt;g;++g)for(u.call(n,s[0][g],p=v[g],l[0][g][1]),h=1;d&gt;h;++h)u.call(n,s[h][g],p+=l[h-1][g][1],l[h][g][1]);return a}var t=wt,e=ei,r=ri,u=ti,i=Qu,o=ni;return n.values=function(e){return arguments.length?(t=e,n):t},n.order=function(t){return arguments.length?(e=&quot;function&quot;==typeof t?t:as.get(t)||ei,n):e},n.offset=function(t){return arguments.length?(r=&quot;function&quot;==typeof t?t:cs.get(t)||ri,n):r},n.x=function(t){return arguments.length?(i=t,n):i},n.y=function(t){return arguments.length?(o=t,n):o},n.out=function(t){return arguments.length?(u=t,n):
 u},n};var as=Zo.map({&quot;inside-out&quot;:function(n){var t,e,r=n.length,u=n.map(ui),i=n.map(ii),o=Zo.range(r).sort(function(n,t){return u[n]-u[t]}),a=0,c=0,s=[],l=[];for(t=0;r&gt;t;++t)e=o[t],c&gt;a?(a+=i[e],s.push(e)):(c+=i[e],l.push(e));return l.reverse().concat(s)},reverse:function(n){return Zo.range(n.length).reverse()},&quot;default&quot;:ei}),cs=Zo.map({silhouette:function(n){var t,e,r,u=n.length,i=n[0].length,o=[],a=0,c=[];for(e=0;i&gt;e;++e){for(t=0,r=0;u&gt;t;t++)r+=n[t][e][1];r&gt;a&amp;&amp;(a=r),o.push(r)}for(e=0;i&gt;e;++e)c[e]=(a-o[e])/2;return c},wiggle:function(n){var t,e,r,u,i,o,a,c,s,l=n.length,f=n[0],h=f.length,g=[];for(g[0]=c=s=0,e=1;h&gt;e;++e){for(t=0,u=0;l&gt;t;++t)u+=n[t][e][1];for(t=0,i=0,a=f[e][0]-f[e-1][0];l&gt;t;++t){for(r=0,o=(n[t][e][1]-n[t][e-1][1])/(2*a);t&gt;r;++r)o+=(n[r][e][1]-n[r][e-1][1])/a;i+=o*n[t][e][1]}g[e]=c-=u?i/u*a:0,s&gt;c&amp;&amp;(s=c)}for(e=0;h&gt;e;++e)g[e]-=s;return g},expand:function(n){var t,e,r,u=n.length,i=n[0].length,
 o=1/u,a=[];for(e=0;i&gt;e;++e){for(t=0,r=0;u&gt;t;t++)r+=n[t][e][1];if(r)for(t=0;u&gt;t;t++)n[t][e][1]/=r;else for(t=0;u&gt;t;t++)n[t][e][1]=o}for(e=0;i&gt;e;++e)a[e]=0;return a},zero:ri});Zo.layout.histogram=function(){function n(n,i){for(var o,a,c=[],s=n.map(e,this),l=r.call(this,s,i),f=u.call(this,l,s,i),i=-1,h=s.length,g=f.length-1,p=t?1:1/h;++i&lt;g;)o=c[i]=[],o.dx=f[i+1]-(o.x=f[i]),o.y=0;if(g&gt;0)for(i=-1;++i&lt;h;)a=s[i],a&gt;=l[0]&amp;&amp;a&lt;=l[1]&amp;&amp;(o=c[Zo.bisect(f,a,1,g)-1],o.y+=p,o.push(n[i]));return c}var t=!0,e=Number,r=si,u=ai;return n.value=function(t){return arguments.length?(e=t,n):e},n.range=function(t){return arguments.length?(r=bt(t),n):r},n.bins=function(t){return arguments.length?(u=&quot;number&quot;==typeof t?function(n){return ci(n,t)}:bt(t),n):u},n.frequency=function(e){return arguments.length?(t=!!e,n):t},n},Zo.layout.pack=function(){function n(n,i){var o=e.call(this,n,i),a=o[0],c=u[0],s=u[1],l=null==t?Math.sqrt:&quot;function&quot;==typ
 eof t?t:function(){return t};if(a.x=a.y=0,Bu(a,function(n){n.r=+l(n.value)}),Bu(a,pi),r){var f=r*(t?1:Math.max(2*a.r/c,2*a.r/s))/2;Bu(a,function(n){n.r+=f}),Bu(a,pi),Bu(a,function(n){n.r-=f})}return mi(a,c/2,s/2,t?1:1/Math.max(2*a.r/c,2*a.r/s)),o}var t,e=Zo.layout.hierarchy().sort(li),r=0,u=[1,1];return n.size=function(t){return arguments.length?(u=t,n):u},n.radius=function(e){return arguments.length?(t=null==e||&quot;function&quot;==typeof e?e:+e,n):t},n.padding=function(t){return arguments.length?(r=+t,n):r},Xu(n,e)},Zo.layout.tree=function(){function n(n,u){var l=o.call(this,n,u),f=l[0],h=t(f);if(Bu(h,e),h.parent.m=-h.z,$u(h,r),s)$u(f,i);else{var g=f,p=f,v=f;$u(f,function(n){n.x&lt;g.x&amp;&amp;(g=n),n.x&gt;p.x&amp;&amp;(p=n),n.depth&gt;v.depth&amp;&amp;(v=n)});var d=a(g,p)/2-g.x,m=c[0]/(p.x+a(p,g)/2+d),y=c[1]/(v.depth||1);$u(f,function(n){n.x=(n.x+d)*m,n.y=n.depth*y})}return l}function t(n){for(var t,e={A:null,children:[n]},r=[e];null!=(t=r.pop());)for(var u,i=t.children
 ,o=0,a=i.length;a&gt;o;++o)r.push((i[o]=u={_:i[o],parent:t,children:(u=i[o].children)&amp;&amp;u.slice()||[],A:null,a:null,z:0,m:0,c:0,s:0,t:null,i:o}).a=u);return e.children[0]}function e(n){var t=n.children,e=n.parent.children,r=n.i?e[n.i-1]:null;if(t.length){wi(n);var i=(t[0].z+t[t.length-1].z)/2;r?(n.z=r.z+a(n._,r._),n.m=n.z-i):n.z=i}else r&amp;&amp;(n.z=r.z+a(n._,r._));n.parent.A=u(n,r,n.parent.A||e[0])}function r(n){n._.x=n.z+n.parent.m,n.m+=n.parent.m}function u(n,t,e){if(t){for(var r,u=n,i=n,o=t,c=u.parent.children[0],s=u.m,l=i.m,f=o.m,h=c.m;o=_i(o),u=Mi(u),o&amp;&amp;u;)c=Mi(c),i=_i(i),i.a=n,r=o.z+f-u.z-s+a(o._,u._),r&gt;0&amp;&amp;(bi(Si(o,n,e),n,r),s+=r,l+=r),f+=o.m,s+=u.m,h+=c.m,l+=i.m;o&amp;&amp;!_i(i)&amp;&amp;(i.t=o,i.m+=f-l),u&amp;&amp;!Mi(c)&amp;&amp;(c.t=u,c.m+=s-h,e=n)}return e}function i(n){n.x*=c[0],n.y=n.depth*c[1]}var o=Zo.layout.hierarchy().sort(null).value(null),a=xi,c=[1,1],s=null;return n.separation=function(t){return arguments.length?(a=t,n):a},n.
 size=function(t){return arguments.length?(s=null==(c=t)?i:null,n):s?null:c},n.nodeSize=function(t){return arguments.length?(s=null==(c=t)?null:i,n):s?c:null},Xu(n,o)},Zo.layout.cluster=function(){function n(n,i){var o,a=t.call(this,n,i),c=a[0],s=0;Bu(c,function(n){var t=n.children;t&amp;&amp;t.length?(n.x=Ei(t),n.y=ki(t)):(n.x=o?s+=e(n,o):0,n.y=0,o=n)});var l=Ai(c),f=Ci(c),h=l.x-e(l,f)/2,g=f.x+e(f,l)/2;return Bu(c,u?function(n){n.x=(n.x-c.x)*r[0],n.y=(c.y-n.y)*r[1]}:function(n){n.x=(n.x-h)/(g-h)*r[0],n.y=(1-(c.y?n.y/c.y:1))*r[1]}),a}var t=Zo.layout.hierarchy().sort(null).value(null),e=xi,r=[1,1],u=!1;return n.separation=function(t){return arguments.length?(e=t,n):e},n.size=function(t){return arguments.length?(u=null==(r=t),n):u?null:r},n.nodeSize=function(t){return arguments.length?(u=null!=(r=t),n):u?r:null},Xu(n,t)},Zo.layout.treemap=function(){function n(n,t){for(var e,r,u=-1,i=n.length;++u&lt;i;)r=(e=n[u]).value*(0&gt;t?0:t),e.area=isNaN(r)||0&gt;=r?0:r}function t(e){var
  i=e.children;if(i&amp;&amp;i.length){var o,a,c,s=f(e),l=[],h=i.slice(),p=1/0,v=&quot;slice&quot;===g?s.dx:&quot;dice&quot;===g?s.dy:&quot;slice-dice&quot;===g?1&amp;e.depth?s.dy:s.dx:Math.min(s.dx,s.dy);for(n(h,s.dx*s.dy/e.value),l.area=0;(c=h.length)&gt;0;)l.push(o=h[c-1]),l.area+=o.area,&quot;squarify&quot;!==g||(a=r(l,v))&lt;=p?(h.pop(),p=a):(l.area-=l.pop().area,u(l,v,s,!1),v=Math.min(s.dx,s.dy),l.length=l.area=0,p=1/0);l.length&amp;&amp;(u(l,v,s,!0),l.length=l.area=0),i.forEach(t)}}function e(t){var r=t.children;if(r&amp;&amp;r.length){var i,o=f(t),a=r.slice(),c=[];for(n(a,o.dx*o.dy/t.value),c.area=0;i=a.pop();)c.push(i),c.area+=i.area,null!=i.z&amp;&amp;(u(c,i.z?o.dx:o.dy,o,!a.length),c.length=c.area=0);r.forEach(e)}}function r(n,t){for(var e,r=n.area,u=0,i=1/0,o=-1,a=n.length;++o&lt;a;)(e=n[o].area)&amp;&amp;(i&gt;e&amp;&amp;(i=e),e&gt;u&amp;&amp;(u=e));return r*=r,t*=t,r?Math.max(t*u*p/r,r/(t*i*p)):1/0}function u(n,t,e,r){var u,i=-1,o=n.length,a=e.x,s=e.y,l=t?c(n.ar
 ea/t):0;if(t==e.dx){for((r||l&gt;e.dy)&amp;&amp;(l=e.dy);++i&lt;o;)u=n[i],u.x=a,u.y=s,u.dy=l,a+=u.dx=Math.min(e.x+e.dx-a,l?c(u.area/l):0);u.z=!0,u.dx+=e.x+e.dx-a,e.y+=l,e.dy-=l}else{for((r||l&gt;e.dx)&amp;&amp;(l=e.dx);++i&lt;o;)u=n[i],u.x=a,u.y=s,u.dx=l,s+=u.dy=Math.min(e.y+e.dy-s,l?c(u.area/l):0);u.z=!1,u.dy+=e.y+e.dy-s,e.x+=l,e.dx-=l}}function i(r){var u=o||a(r),i=u[0];return i.x=0,i.y=0,i.dx=s[0],i.dy=s[1],o&amp;&amp;a.revalue(i),n([i],i.dx*i.dy/i.value),(o?e:t)(i),h&amp;&amp;(o=u),u}var o,a=Zo.layout.hierarchy(),c=Math.round,s=[1,1],l=null,f=Ni,h=!1,g=&quot;squarify&quot;,p=.5*(1+Math.sqrt(5));return i.size=function(n){return arguments.length?(s=n,i):s},i.padding=function(n){function t(t){var e=n.call(i,t,t.depth);return null==e?Ni(t):zi(t,&quot;number&quot;==typeof e?[e,e,e,e]:e)}function e(t){return zi(t,n)}if(!arguments.length)return l;var r;return f=null==(l=n)?Ni:&quot;function&quot;==(r=typeof n)?t:&quot;number&quot;===r?(n=[n,n,n,n],e):e,i},i.round=function(n){re
 turn arguments.length?(c=n?Math.round:Number,i):c!=Number},i.sticky=function(n){return arguments.length?(h=n,o=null,i):h},i.ratio=function(n){return arguments.length?(p=n,i):p},i.mode=function(n){return arguments.length?(g=n+&quot;&quot;,i):g},Xu(i,a)},Zo.random={normal:function(n,t){var e=arguments.length;return 2&gt;e&amp;&amp;(t=1),1&gt;e&amp;&amp;(n=0),function(){var e,r,u;do e=2*Math.random()-1,r=2*Math.random()-1,u=e*e+r*r;while(!u||u&gt;1);return n+t*e*Math.sqrt(-2*Math.log(u)/u)}},logNormal:function(){var n=Zo.random.normal.apply(Zo,arguments);return function(){return Math.exp(n())}},bates:function(n){var t=Zo.random.irwinHall(n);return function(){return t()/n}},irwinHall:function(n){return function(){for(var t=0,e=0;n&gt;e;e++)t+=Math.random();return t}}},Zo.scale={};var ss={floor:wt,ceil:wt};Zo.scale.linear=function(){return Ui([0,1],[0,1],hu,!1)};var ls={s:1,g:1,p:1,r:1,e:1};Zo.scale.log=function(){return Vi(Zo.scale.linear().domain([0,1]),10,!0,[1,10])};var fs=Zo
 .format(&quot;.0e&quot;),hs={floor:function(n){return-Math.ceil(-n)},ceil:function(n){return-Math.floor(-n)}};Zo.scale.pow=function(){return Xi(Zo.scale.linear(),1,[0,1])},Zo.scale.sqrt=function(){return Zo.scale.pow().exponent(.5)},Zo.scale.ordinal=function(){return Bi([],{t:&quot;range&quot;,a:[[]]})},Zo.scale.category10=function(){return Zo.scale.ordinal().range(gs)},Zo.scale.category20=function(){return Zo.scale.ordinal().range(ps)},Zo.scale.category20b=function(){return Zo.scale.ordinal().range(vs)},Zo.scale.category20c=function(){return Zo.scale.ordinal().range(ds)};var gs=[2062260,16744206,2924588,14034728,9725885,9197131,14907330,8355711,12369186,1556175].map(vt),ps=[2062260,11454440,16744206,16759672,2924588,10018698,14034728,16750742,9725885,12955861,9197131,12885140,14907330,16234194,8355711,13092807,12369186,14408589,1556175,10410725].map(vt),vs=[3750777,5395619,7040719,10264286,6519097,9216594,11915115,13556636,9202993,12426809,15186514,15190932,8666169,11356490
 ,14049643,15177372,8077683,10834324,13528509,14589654].map(vt),ds=[3244733,7057110,10406625,13032431,15095053,16616764,16625259,16634018,3253076,7652470,10607003,13101504,7695281,10394312,12369372,14342891,6513507,9868950,12434877,14277081].map(vt);Zo.scale.quantile=function(){return Wi([],[])},Zo.scale.quantize=function(){return Ji(0,1,[0,1])},Zo.scale.threshold=function(){return Gi([.5],[0,1])},Zo.scale.identity=function(){return Ki([0,1])},Zo.svg={},Zo.svg.arc=function(){function n(){var n=t.apply(this,arguments),i=e.apply(this,arguments),o=r.apply(this,arguments)+ms,a=u.apply(this,arguments)+ms,c=(o&gt;a&amp;&amp;(c=o,o=a,a=c),a-o),s=ba&gt;c?&quot;0&quot;:&quot;1&quot;,l=Math.cos(o),f=Math.sin(o),h=Math.cos(a),g=Math.sin(a);
+return c&gt;=ys?n?&quot;M0,&quot;+i+&quot;A&quot;+i+&quot;,&quot;+i+&quot; 0 1,1 0,&quot;+-i+&quot;A&quot;+i+&quot;,&quot;+i+&quot; 0 1,1 0,&quot;+i+&quot;M0,&quot;+n+&quot;A&quot;+n+&quot;,&quot;+n+&quot; 0 1,0 0,&quot;+-n+&quot;A&quot;+n+&quot;,&quot;+n+&quot; 0 1,0 0,&quot;+n+&quot;Z&quot;:&quot;M0,&quot;+i+&quot;A&quot;+i+&quot;,&quot;+i+&quot; 0 1,1 0,&quot;+-i+&quot;A&quot;+i+&quot;,&quot;+i+&quot; 0 1,1 0,&quot;+i+&quot;Z&quot;:n?&quot;M&quot;+i*l+&quot;,&quot;+i*f+&quot;A&quot;+i+&quot;,&quot;+i+&quot; 0 &quot;+s+&quot;,1 &quot;+i*h+&quot;,&quot;+i*g+&quot;L&quot;+n*h+&quot;,&quot;+n*g+&quot;A&quot;+n+&quot;,&quot;+n+&quot; 0 &quot;+s+&quot;,0 &quot;+n*l+&quot;,&quot;+n*f+&quot;Z&quot;:&quot;M&quot;+i*l+&quot;,&quot;+i*f+&quot;A&quot;+i+&quot;,&quot;+i+&quot; 0 &quot;+s+&quot;,1 &quot;+i*h+&quot;,&quot;+i*g+&quot;L0,0&quot;+&quot;Z&quot;}var t=Qi,e=no,r=to,u=eo;return n.innerRadius=function(e){return arguments.length?(t=bt(e),n):t},n.outerRadius=function(t){return ar
 guments.length?(e=bt(t),n):e},n.startAngle=function(t){return arguments.length?(r=bt(t),n):r},n.endAngle=function(t){return arguments.length?(u=bt(t),n):u},n.centroid=function(){var n=(t.apply(this,arguments)+e.apply(this,arguments))/2,i=(r.apply(this,arguments)+u.apply(this,arguments))/2+ms;return[Math.cos(i)*n,Math.sin(i)*n]},n};var ms=-Sa,ys=wa-ka;Zo.svg.line=function(){return ro(wt)};var xs=Zo.map({linear:uo,&quot;linear-closed&quot;:io,step:oo,&quot;step-before&quot;:ao,&quot;step-after&quot;:co,basis:po,&quot;basis-open&quot;:vo,&quot;basis-closed&quot;:mo,bundle:yo,cardinal:fo,&quot;cardinal-open&quot;:so,&quot;cardinal-closed&quot;:lo,monotone:So});xs.forEach(function(n,t){t.key=n,t.closed=/-closed$/.test(n)});var Ms=[0,2/3,1/3,0],_s=[0,1/3,2/3,0],bs=[0,1/6,2/3,1/6];Zo.svg.line.radial=function(){var n=ro(ko);return n.radius=n.x,delete n.x,n.angle=n.y,delete n.y,n},ao.reverse=co,co.reverse=ao,Zo.svg.area=function(){return Eo(wt)},Zo.svg.area.radial=function(){var n=Eo
 (ko);return n.radius=n.x,delete n.x,n.innerRadius=n.x0,delete n.x0,n.outerRadius=n.x1,delete n.x1,n.angle=n.y,delete n.y,n.startAngle=n.y0,delete n.y0,n.endAngle=n.y1,delete n.y1,n},Zo.svg.chord=function(){function n(n,a){var c=t(this,i,n,a),s=t(this,o,n,a);return&quot;M&quot;+c.p0+r(c.r,c.p1,c.a1-c.a0)+(e(c,s)?u(c.r,c.p1,c.r,c.p0):u(c.r,c.p1,s.r,s.p0)+r(s.r,s.p1,s.a1-s.a0)+u(s.r,s.p1,c.r,c.p0))+&quot;Z&quot;}function t(n,t,e,r){var u=t.call(n,e,r),i=a.call(n,u,r),o=c.call(n,u,r)+ms,l=s.call(n,u,r)+ms;return{r:i,a0:o,a1:l,p0:[i*Math.cos(o),i*Math.sin(o)],p1:[i*Math.cos(l),i*Math.sin(l)]}}function e(n,t){return n.a0==t.a0&amp;&amp;n.a1==t.a1}function r(n,t,e){return&quot;A&quot;+n+&quot;,&quot;+n+&quot; 0 &quot;+ +(e&gt;ba)+&quot;,1 &quot;+t}function u(n,t,e,r){return&quot;Q 0,0 &quot;+r}var i=gr,o=pr,a=Ao,c=to,s=eo;return n.radius=function(t){return arguments.length?(a=bt(t),n):a},n.source=function(t){return arguments.length?(i=bt(t),n):i},n.target=function(t){return argumen
 ts.length?(o=bt(t),n):o},n.startAngle=function(t){return arguments.length?(c=bt(t),n):c},n.endAngle=function(t){return arguments.length?(s=bt(t),n):s},n},Zo.svg.diagonal=function(){function n(n,u){var i=t.call(this,n,u),o=e.call(this,n,u),a=(i.y+o.y)/2,c=[i,{x:i.x,y:a},{x:o.x,y:a},o];return c=c.map(r),&quot;M&quot;+c[0]+&quot;C&quot;+c[1]+&quot; &quot;+c[2]+&quot; &quot;+c[3]}var t=gr,e=pr,r=Co;return n.source=function(e){return arguments.length?(t=bt(e),n):t},n.target=function(t){return arguments.length?(e=bt(t),n):e},n.projection=function(t){return arguments.length?(r=t,n):r},n},Zo.svg.diagonal.radial=function(){var n=Zo.svg.diagonal(),t=Co,e=n.projection;return n.projection=function(n){return arguments.length?e(No(t=n)):t},n},Zo.svg.symbol=function(){function n(n,r){return(ws.get(t.call(this,n,r))||To)(e.call(this,n,r))}var t=Lo,e=zo;return n.type=function(e){return arguments.length?(t=bt(e),n):t},n.size=function(t){return arguments.length?(e=bt(t),n):e},n};var ws=Zo.map(
 {circle:To,cross:function(n){var t=Math.sqrt(n/5)/2;return&quot;M&quot;+-3*t+&quot;,&quot;+-t+&quot;H&quot;+-t+&quot;V&quot;+-3*t+&quot;H&quot;+t+&quot;V&quot;+-t+&quot;H&quot;+3*t+&quot;V&quot;+t+&quot;H&quot;+t+&quot;V&quot;+3*t+&quot;H&quot;+-t+&quot;V&quot;+t+&quot;H&quot;+-3*t+&quot;Z&quot;},diamond:function(n){var t=Math.sqrt(n/(2*As)),e=t*As;return&quot;M0,&quot;+-t+&quot;L&quot;+e+&quot;,0&quot;+&quot; 0,&quot;+t+&quot; &quot;+-e+&quot;,0&quot;+&quot;Z&quot;},square:function(n){var t=Math.sqrt(n)/2;return&quot;M&quot;+-t+&quot;,&quot;+-t+&quot;L&quot;+t+&quot;,&quot;+-t+&quot; &quot;+t+&quot;,&quot;+t+&quot; &quot;+-t+&quot;,&quot;+t+&quot;Z&quot;},&quot;triangle-down&quot;:function(n){var t=Math.sqrt(n/Es),e=t*Es/2;return&quot;M0,&quot;+e+&quot;L&quot;+t+&quot;,&quot;+-e+&quot; &quot;+-t+&quot;,&quot;+-e+&quot;Z&quot;},&quot;triangle-up&quot;:function(n){var t=Math.sqrt(n/Es),e=t*Es/2;return&quot;M0,&quot;+-e+&quot;L&quot;+t+&quot;,&quot;+e+&quot; &quot;+-t+&quot;,&
 quot;+e+&quot;Z&quot;}});Zo.svg.symbolTypes=ws.keys();var Ss,ks,Es=Math.sqrt(3),As=Math.tan(30*Aa),Cs=[],Ns=0;Cs.call=pa.call,Cs.empty=pa.empty,Cs.node=pa.node,Cs.size=pa.size,Zo.transition=function(n){return arguments.length?Ss?n.transition():n:ma.transition()},Zo.transition.prototype=Cs,Cs.select=function(n){var t,e,r,u=this.id,i=[];n=b(n);for(var o=-1,a=this.length;++o&lt;a;){i.push(t=[]);for(var c=this[o],s=-1,l=c.length;++s&lt;l;)(r=c[s])&amp;&amp;(e=n.call(r,r.__data__,s,o))?(&quot;__data__&quot;in r&amp;&amp;(e.__data__=r.__data__),Po(e,s,u,r.__transition__[u]),t.push(e)):t.push(null)}return qo(i,u)},Cs.selectAll=function(n){var t,e,r,u,i,o=this.id,a=[];n=w(n);for(var c=-1,s=this.length;++c&lt;s;)for(var l=this[c],f=-1,h=l.length;++f&lt;h;)if(r=l[f]){i=r.__transition__[o],e=n.call(r,r.__data__,f,c),a.push(t=[]);for(var g=-1,p=e.length;++g&lt;p;)(u=e[g])&amp;&amp;Po(u,g,o,i),t.push(u)}return qo(a,o)},Cs.filter=function(n){var t,e,r,u=[];&quot;function&quot;!=typeof n&a
 mp;&amp;(n=R(n));for(var i=0,o=this.length;o&gt;i;i++){u.push(t=[]);for(var e=this[i],a=0,c=e.length;c&gt;a;a++)(r=e[a])&amp;&amp;n.call(r,r.__data__,a,i)&amp;&amp;t.push(r)}return qo(u,this.id)},Cs.tween=function(n,t){var e=this.id;return arguments.length&lt;2?this.node().__transition__[e].tween.get(n):P(this,null==t?function(t){t.__transition__[e].tween.remove(n)}:function(r){r.__transition__[e].tween.set(n,t)})},Cs.attr=function(n,t){function e(){this.removeAttribute(a)}function r(){this.removeAttributeNS(a.space,a.local)}function u(n){return null==n?e:(n+=&quot;&quot;,function(){var t,e=this.getAttribute(a);return e!==n&amp;&amp;(t=o(e,n),function(n){this.setAttribute(a,t(n))})})}function i(n){return null==n?r:(n+=&quot;&quot;,function(){var t,e=this.getAttributeNS(a.space,a.local);return e!==n&amp;&amp;(t=o(e,n),function(n){this.setAttributeNS(a.space,a.local,t(n))})})}if(arguments.length&lt;2){for(t in n)this.attr(t,n[t]);return this}var o=&quot;transform&quot;==n?Du:h
 u,a=Zo.ns.qualify(n);return Ro(this,&quot;attr.&quot;+n,t,a.local?i:u)},Cs.attrTween=function(n,t){function e(n,e){var r=t.call(this,n,e,this.getAttribute(u));return r&amp;&amp;function(n){this.setAttribute(u,r(n))}}function r(n,e){var r=t.call(this,n,e,this.getAttributeNS(u.space,u.local));return r&amp;&amp;function(n){this.setAttributeNS(u.space,u.local,r(n))}}var u=Zo.ns.qualify(n);return this.tween(&quot;attr.&quot;+n,u.local?r:e)},Cs.style=function(n,t,e){function r(){this.style.removeProperty(n)}function u(t){return null==t?r:(t+=&quot;&quot;,function(){var r,u=Wo.getComputedStyle(this,null).getPropertyValue(n);return u!==t&amp;&amp;(r=hu(u,t),function(t){this.style.setProperty(n,r(t),e)})})}var i=arguments.length;if(3&gt;i){if(&quot;string&quot;!=typeof n){2&gt;i&amp;&amp;(t=&quot;&quot;);for(e in n)this.style(e,n[e],t);return this}e=&quot;&quot;}return Ro(this,&quot;style.&quot;+n,t,u)},Cs.styleTween=function(n,t,e){function r(r,u){var i=t.call(this,r,u,Wo.getCompute
 dStyle(this,null).getPropertyValue(n));return i&amp;&amp;function(t){this.style.setProperty(n,i(t),e)}}return arguments.length&lt;3&amp;&amp;(e=&quot;&quot;),this.tween(&quot;style.&quot;+n,r)},Cs.text=function(n){return Ro(this,&quot;text&quot;,n,Do)},Cs.remove=function(){return this.each(&quot;end.transition&quot;,function(){var n;this.__transition__.count&lt;2&amp;&amp;(n=this.parentNode)&amp;&amp;n.removeChild(this)})},Cs.ease=function(n){var t=this.id;return arguments.length&lt;1?this.node().__transition__[t].ease:(&quot;function&quot;!=typeof n&amp;&amp;(n=Zo.ease.apply(Zo,arguments)),P(this,function(e){e.__transition__[t].ease=n}))},Cs.delay=function(n){var t=this.id;return arguments.length&lt;1?this.node().__transition__[t].delay:P(this,&quot;function&quot;==typeof n?function(e,r,u){e.__transition__[t].delay=+n.call(e,e.__data__,r,u)}:(n=+n,function(e){e.__transition__[t].delay=n}))},Cs.duration=function(n){var t=this.id;return arguments.length&lt;1?this.node().__tra
 nsition__[t].duration:P(this,&quot;function&quot;==typeof n?function(e,r,u){e.__transition__[t].duration=Math.max(1,n.call(e,e.__data__,r,u))}:(n=Math.max(1,n),function(e){e.__transition__[t].duration=n}))},Cs.each=function(n,t){var e=this.id;if(arguments.length&lt;2){var r=ks,u=Ss;Ss=e,P(this,function(t,r,u){ks=t.__transition__[e],n.call(t,t.__data__,r,u)}),ks=r,Ss=u}else P(this,function(r){var u=r.__transition__[e];(u.event||(u.event=Zo.dispatch(&quot;start&quot;,&quot;end&quot;))).on(n,t)});return this},Cs.transition=function(){for(var n,t,e,r,u=this.id,i=++Ns,o=[],a=0,c=this.length;c&gt;a;a++){o.push(n=[]);for(var t=this[a],s=0,l=t.length;l&gt;s;s++)(e=t[s])&amp;&amp;(r=Object.create(e.__transition__[u]),r.delay+=r.duration,Po(e,s,i,r)),n.push(e)}return qo(o,i)},Zo.svg.axis=function(){function n(n){n.each(function(){var n,s=Zo.select(this),l=this.__chart__||e,f=this.__chart__=e.copy(),h=null==c?f.ticks?f.ticks.apply(f,a):f.domain():c,g=null==t?f.tickFormat?f.tickFormat.a
 pply(f,a):wt:t,p=s.selectAll(&quot;.tick&quot;).data(h,f),v=p.enter().insert(&quot;g&quot;,&quot;.domain&quot;).attr(&quot;class&quot;,&quot;tick&quot;).style(&quot;opacity&quot;,ka),d=Zo.transition(p.exit()).style(&quot;opacity&quot;,ka).remove(),m=Zo.transition(p.order()).style(&quot;opacity&quot;,1),y=Ti(f),x=s.selectAll(&quot;.domain&quot;).data([0]),M=(x.enter().append(&quot;path&quot;).attr(&quot;class&quot;,&quot;domain&quot;),Zo.transition(x));v.append(&quot;line&quot;),v.append(&quot;text&quot;);var _=v.select(&quot;line&quot;),b=m.select(&quot;line&quot;),w=p.select(&quot;text&quot;).text(g),S=v.select(&quot;text&quot;),k=m.select(&quot;text&quot;);switch(r){case&quot;bottom&quot;:n=Uo,_.attr(&quot;y2&quot;,u),S.attr(&quot;y&quot;,Math.max(u,0)+o),b.attr(&quot;x2&quot;,0).attr(&quot;y2&quot;,u),k.attr(&quot;x&quot;,0).attr(&quot;y&quot;,Math.max(u,0)+o),w.attr(&quot;dy&quot;,&quot;.71em&quot;).style(&quot;text-anchor&quot;,&quot;middle&quot;),M.attr(&quot;d&quot;,&
 quot;M&quot;+y[0]+&quot;,&quot;+i+&quot;V0H&quot;+y[1]+&quot;V&quot;+i);break;case&quot;top&quot;:n=Uo,_.attr(&quot;y2&quot;,-u),S.attr(&quot;y&quot;,-(Math.max(u,0)+o)),b.attr(&quot;x2&quot;,0).attr(&quot;y2&quot;,-u),k.attr(&quot;x&quot;,0).attr(&quot;y&quot;,-(Math.max(u,0)+o)),w.attr(&quot;dy&quot;,&quot;0em&quot;).style(&quot;text-anchor&quot;,&quot;middle&quot;),M.attr(&quot;d&quot;,&quot;M&quot;+y[0]+&quot;,&quot;+-i+&quot;V0H&quot;+y[1]+&quot;V&quot;+-i);break;case&quot;left&quot;:n=jo,_.attr(&quot;x2&quot;,-u),S.attr(&quot;x&quot;,-(Math.max(u,0)+o)),b.attr(&quot;x2&quot;,-u).attr(&quot;y2&quot;,0),k.attr(&quot;x&quot;,-(Math.max(u,0)+o)).attr(&quot;y&quot;,0),w.attr(&quot;dy&quot;,&quot;.32em&quot;).style(&quot;text-anchor&quot;,&quot;end&quot;),M.attr(&quot;d&quot;,&quot;M&quot;+-i+&quot;,&quot;+y[0]+&quot;H0V&quot;+y[1]+&quot;H&quot;+-i);break;case&quot;right&quot;:n=jo,_.attr(&quot;x2&quot;,u),S.attr(&quot;x&quot;,Math.max(u,0)+o),b.attr(&quot;x2&quot;,u).attr(&
 quot;y2&quot;,0),k.attr(&quot;x&quot;,Math.max(u,0)+o).attr(&quot;y&quot;,0),w.attr(&quot;dy&quot;,&quot;.32em&quot;).style(&quot;text-anchor&quot;,&quot;start&quot;),M.attr(&quot;d&quot;,&quot;M&quot;+i+&quot;,&quot;+y[0]+&quot;H0V&quot;+y[1]+&quot;H&quot;+i)}if(f.rangeBand){var E=f,A=E.rangeBand()/2;l=f=function(n){return E(n)+A}}else l.rangeBand?l=f:d.call(n,f);v.call(n,l),m.call(n,f)})}var t,e=Zo.scale.linear(),r=zs,u=6,i=6,o=3,a=[10],c=null;return n.scale=function(t){return arguments.length?(e=t,n):e},n.orient=function(t){return arguments.length?(r=t in Ls?t+&quot;&quot;:zs,n):r},n.ticks=function(){return arguments.length?(a=arguments,n):a},n.tickValues=function(t){return arguments.length?(c=t,n):c},n.tickFormat=function(e){return arguments.length?(t=e,n):t},n.tickSize=function(t){var e=arguments.length;return e?(u=+t,i=+arguments[e-1],n):u},n.innerTickSize=function(t){return arguments.length?(u=+t,n):u},n.outerTickSize=function(t){return arguments.length?(i=+t,n):i},n.
 tickPadding=function(t){return arguments.length?(o=+t,n):o},n.tickSubdivide=function(){return arguments.length&amp;&amp;n},n};var zs=&quot;bottom&quot;,Ls={top:1,right:1,bottom:1,left:1};Zo.svg.brush=function(){function n(i){i.each(function(){var i=Zo.select(this).style(&quot;pointer-events&quot;,&quot;all&quot;).style(&quot;-webkit-tap-highlight-color&quot;,&quot;rgba(0,0,0,0)&quot;).on(&quot;mousedown.brush&quot;,u).on(&quot;touchstart.brush&quot;,u),o=i.selectAll(&quot;.background&quot;).data([0]);o.enter().append(&quot;rect&quot;).attr(&quot;class&quot;,&quot;background&quot;).style(&quot;visibility&quot;,&quot;hidden&quot;).style(&quot;cursor&quot;,&quot;crosshair&quot;),i.selectAll(&quot;.extent&quot;).data([0]).enter().append(&quot;rect&quot;).attr(&quot;class&quot;,&quot;extent&quot;).style(&quot;cursor&quot;,&quot;move&quot;);var a=i.selectAll(&quot;.resize&quot;).data(p,wt);a.exit().remove(),a.enter().append(&quot;g&quot;).attr(&quot;class&quot;,function(n){return&
 quot;resize &quot;+n}).style(&quot;cursor&quot;,function(n){return Ts[n]}).append(&quot;rect&quot;).attr(&quot;x&quot;,function(n){return/[ew]$/.test(n)?-3:null}).attr(&quot;y&quot;,function(n){return/^[ns]/.test(n)?-3:null}).attr(&quot;width&quot;,6).attr(&quot;height&quot;,6).style(&quot;visibility&quot;,&quot;hidden&quot;),a.style(&quot;display&quot;,n.empty()?&quot;none&quot;:null);var l,f=Zo.transition(i),h=Zo.transition(o);c&amp;&amp;(l=Ti(c),h.attr(&quot;x&quot;,l[0]).attr(&quot;width&quot;,l[1]-l[0]),e(f)),s&amp;&amp;(l=Ti(s),h.attr(&quot;y&quot;,l[0]).attr(&quot;height&quot;,l[1]-l[0]),r(f)),t(f)})}function t(n){n.selectAll(&quot;.resize&quot;).attr(&quot;transform&quot;,function(n){return&quot;translate(&quot;+l[+/e$/.test(n)]+&quot;,&quot;+f[+/^s/.test(n)]+&quot;)&quot;})}function e(n){n.select(&quot;.extent&quot;).attr(&quot;x&quot;,l[0]),n.selectAll(&quot;.extent,.n&gt;rect,.s&gt;rect&quot;).attr(&quot;width&quot;,l[1]-l[0])}function r(n){n.select(&quot;.extent&
 quot;).attr(&quot;y&quot;,f[0]),n.selectAll(&quot;.extent,.e&gt;rect,.w&gt;rect&quot;).attr(&quot;height&quot;,f[1]-f[0])}function u(){function u(){32==Zo.event.keyCode&amp;&amp;(C||(x=null,z[0]-=l[1],z[1]-=f[1],C=2),y())}function p(){32==Zo.event.keyCode&amp;&amp;2==C&amp;&amp;(z[0]+=l[1],z[1]+=f[1],C=0,y())}function v(){var n=Zo.mouse(_),u=!1;M&amp;&amp;(n[0]+=M[0],n[1]+=M[1]),C||(Zo.event.altKey?(x||(x=[(l[0]+l[1])/2,(f[0]+f[1])/2]),z[0]=l[+(n[0]&lt;x[0])],z[1]=f[+(n[1]&lt;x[1])]):x=null),E&amp;&amp;d(n,c,0)&amp;&amp;(e(S),u=!0),A&amp;&amp;d(n,s,1)&amp;&amp;(r(S),u=!0),u&amp;&amp;(t(S),w({type:&quot;brush&quot;,mode:C?&quot;move&quot;:&quot;resize&quot;}))}function d(n,t,e){var r,u,a=Ti(t),c=a[0],s=a[1],p=z[e],v=e?f:l,d=v[1]-v[0];return C&amp;&amp;(c-=p,s-=d+p),r=(e?g:h)?Math.max(c,Math.min(s,n[e])):n[e],C?u=(r+=p)+d:(x&amp;&amp;(p=Math.max(c,Math.min(s,2*x[e]-r))),r&gt;p?(u=r,r=p):u=p),v[0]!=r||v[1]!=u?(e?o=null:i=null,v[0]=r,v[1]=u,!0):void 0}function m(){v(),S.style(&q
 uot;pointer-events&quot;,&quot;all&quot;).selectAll(&quot;.resize&quot;).style(&quot;display&quot;,n.empty()?&quot;none&quot;:null),Zo.select(&quot;body&quot;).style(&quot;cursor&quot;,null),L.on(&quot;mousemove.brush&quot;,null).on(&quot;mouseup.brush&quot;,null).on(&quot;touchmove.brush&quot;,null).on(&quot;touchend.brush&quot;,null).on(&quot;keydown.brush&quot;,null).on(&quot;keyup.brush&quot;,null),N(),w({type:&quot;brushend&quot;})}var x,M,_=this,b=Zo.select(Zo.event.target),w=a.of(_,arguments),S=Zo.select(_),k=b.datum(),E=!/^(n|s)$/.test(k)&amp;&amp;c,A=!/^(e|w)$/.test(k)&amp;&amp;s,C=b.classed(&quot;extent&quot;),N=I(),z=Zo.mouse(_),L=Zo.select(Wo).on(&quot;keydown.brush&quot;,u).on(&quot;keyup.brush&quot;,p);if(Zo.event.changedTouches?L.on(&quot;touchmove.brush&quot;,v).on(&quot;touchend.brush&quot;,m):L.on(&quot;mousemove.brush&quot;,v).on(&quot;mouseup.brush&quot;,m),S.interrupt().selectAll(&quot;*&quot;).interrupt(),C)z[0]=l[0]-z[0],z[1]=f[0]-z[1];else if(k){var T
 =+/w$/.test(k),q=+/^n/.test(k);M=[l[1-T]-z[0],f[1-q]-z[1]],z[0]=l[T],z[1]=f[q]}else Zo.event.altKey&amp;&amp;(x=z.slice());S.style(&quot;pointer-events&quot;,&quot;none&quot;).selectAll(&quot;.resize&quot;).style(&quot;display&quot;,null),Zo.select(&quot;body&quot;).style(&quot;cursor&quot;,b.style(&quot;cursor&quot;)),w({type:&quot;brushstart&quot;}),v()}var i,o,a=M(n,&quot;brushstart&quot;,&quot;brush&quot;,&quot;brushend&quot;),c=null,s=null,l=[0,0],f=[0,0],h=!0,g=!0,p=qs[0];return n.event=function(n){n.each(function(){var n=a.of(this,arguments),t={x:l,y:f,i:i,j:o},e=this.__chart__||t;this.__chart__=t,Ss?Zo.select(this).transition().each(&quot;start.brush&quot;,function(){i=e.i,o=e.j,l=e.x,f=e.y,n({type:&quot;brushstart&quot;})}).tween(&quot;brush:brush&quot;,function(){var e=gu(l,t.x),r=gu(f,t.y);return i=o=null,function(u){l=t.x=e(u),f=t.y=r(u),n({type:&quot;brush&quot;,mode:&quot;resize&quot;})}}).each(&quot;end.brush&quot;,function(){i=t.i,o=t.j,n({type:&quot;brush&qu
 ot;,mode:&quot;resize&quot;}),n({type:&quot;brushend&quot;})}):(n({type:&quot;brushstart&quot;}),n({type:&quot;brush&quot;,mode:&quot;resize&quot;}),n({type:&quot;brushend&quot;}))})},n.x=function(t){return arguments.length?(c=t,p=qs[!c&lt;&lt;1|!s],n):c},n.y=function(t){return arguments.length?(s=t,p=qs[!c&lt;&lt;1|!s],n):s},n.clamp=function(t){return arguments.length?(c&amp;&amp;s?(h=!!t[0],g=!!t[1]):c?h=!!t:s&amp;&amp;(g=!!t),n):c&amp;&amp;s?[h,g]:c?h:s?g:null},n.extent=function(t){var e,r,u,a,h;return arguments.length?(c&amp;&amp;(e=t[0],r=t[1],s&amp;&amp;(e=e[0],r=r[0]),i=[e,r],c.invert&amp;&amp;(e=c(e),r=c(r)),e&gt;r&amp;&amp;(h=e,e=r,r=h),(e!=l[0]||r!=l[1])&amp;&amp;(l=[e,r])),s&amp;&amp;(u=t[0],a=t[1],c&amp;&amp;(u=u[1],a=a[1]),o=[u,a],s.invert&amp;&amp;(u=s(u),a=s(a)),u&gt;a&amp;&amp;(h=u,u=a,a=h),(u!=f[0]||a!=f[1])&amp;&amp;(f=[u,a])),n):(c&amp;&amp;(i?(e=i[0],r=i[1]):(e=l[0],r=l[1],c.invert&amp;&amp;(e=c.invert(e),r=c.invert(r)),e&gt;r&amp;&amp;(h=e,e=r,r=h))),s&a
 mp;&amp;(o?(u=o[0],a=o[1]):(u=f[0],a=f[1],s.invert&amp;&amp;(u=s.invert(u),a=s.invert(a)),u&gt;a&amp;&amp;(h=u,u=a,a=h))),c&amp;&amp;s?[[e,u],[r,a]]:c?[e,r]:s&amp;&amp;[u,a])},n.clear=function(){return n.empty()||(l=[0,0],f=[0,0],i=o=null),n},n.empty=function(){return!!c&amp;&amp;l[0]==l[1]||!!s&amp;&amp;f[0]==f[1]},Zo.rebind(n,a,&quot;on&quot;)};var Ts={n:&quot;ns-resize&quot;,e:&quot;ew-resize&quot;,s:&quot;ns-resize&quot;,w:&quot;ew-resize&quot;,nw:&quot;nwse-resize&quot;,ne:&quot;nesw-resize&quot;,se:&quot;nwse-resize&quot;,sw:&quot;nesw-resize&quot;},qs=[[&quot;n&quot;,&quot;e&quot;,&quot;s&quot;,&quot;w&quot;,&quot;nw&quot;,&quot;ne&quot;,&quot;se&quot;,&quot;sw&quot;],[&quot;e&quot;,&quot;w&quot;],[&quot;n&quot;,&quot;s&quot;],[]],Rs=Qa.format=ic.timeFormat,Ds=Rs.utc,Ps=Ds(&quot;%Y-%m-%dT%H:%M:%S.%LZ&quot;);Rs.iso=Date.prototype.toISOString&amp;&amp;+new Date(&quot;2000-01-01T00:00:00.000Z&quot;)?Ho:Ps,Ho.parse=function(n){var t=new Date(n);return isNaN(t)?null:t},Ho.
 toString=Ps.toString,Qa.second=Dt(function(n){return new nc(1e3*Math.floor(n/1e3))},function(n,t){n.setTime(n.getTime()+1e3*Math.floor(t))},function(n){return n.getSeconds()}),Qa.seconds=Qa.second.range,Qa.seconds.utc=Qa.second.utc.range,Qa.minute=Dt(function(n){return new nc(6e4*Math.floor(n/6e4))},function(n,t){n.setTime(n.getTime()+6e4*Math.floor(t))},function(n){return n.getMinutes()}),Qa.minutes=Qa.minute.range,Qa.minutes.utc=Qa.minute.utc.range,Qa.hour=Dt(function(n){var t=n.getTimezoneOffset()/60;return new nc(36e5*(Math.floor(n/36e5-t)+t))},function(n,t){n.setTime(n.getTime()+36e5*Math.floor(t))},function(n){return n.getHours()}),Qa.hours=Qa.hour.range,Qa.hours.utc=Qa.hour.utc.range,Qa.month=Dt(function(n){return n=Qa.day(n),n.setDate(1),n},function(n,t){n.setMonth(n.getMonth()+t)},function(n){return n.getMonth()}),Qa.months=Qa.month.range,Qa.months.utc=Qa.month.utc.range;var Us=[1e3,5e3,15e3,3e4,6e4,3e5,9e5,18e5,36e5,108e5,216e5,432e5,864e5,1728e5,6048e5,2592e6,7776
 e6,31536e6],js=[[Qa.second,1],[Qa.second,5],[Qa.second,15],[Qa.second,30],[Qa.minute,1],[Qa.minute,5],[Qa.minute,15],[Qa.minute,30],[Qa.hour,1],[Qa.hour,3],[Qa.hour,6],[Qa.hour,12],[Qa.day,1],[Qa.day,2],[Qa.week,1],[Qa.month,1],[Qa.month,3],[Qa.year,1]],Hs=Rs.multi([[&quot;.%L&quot;,function(n){return n.getMilliseconds()}],[&quot;:%S&quot;,function(n){return n.getSeconds()}],[&quot;%I:%M&quot;,function(n){return n.getMinutes()}],[&quot;%I %p&quot;,function(n){return n.getHours()}],[&quot;%a %d&quot;,function(n){return n.getDay()&amp;&amp;1!=n.getDate()}],[&quot;%b %d&quot;,function(n){return 1!=n.getDate()}],[&quot;%B&quot;,function(n){return n.getMonth()}],[&quot;%Y&quot;,we]]),Fs={range:function(n,t,e){return Zo.range(Math.ceil(n/e)*e,+t,e).map(Oo)},floor:wt,ceil:wt};js.year=Qa.year,Qa.scale=function(){return Fo(Zo.scale.linear(),js,Hs)};var Os=js.map(function(n){return[n[0].utc,n[1]]}),Ys=Ds.multi([[&quot;.%L&quot;,function(n){return n.getUTCMilliseconds()}],[&quot;:%S&qu
 ot;,function(n){return n.getUTCSeconds()}],[&quot;%I:%M&quot;,function(n){return n.getUTCMinutes()}],[&quot;%I %p&quot;,function(n){return n.getUTCHours()}],[&quot;%a %d&quot;,function(n){return n.getUTCDay()&amp;&amp;1!=n.getUTCDate()}],[&quot;%b %d&quot;,function(n){return 1!=n.getUTCDate()}],[&quot;%B&quot;,function(n){return n.getUTCMonth()}],[&quot;%Y&quot;,we]]);Os.year=Qa.year.utc,Qa.scale.utc=function(){return Fo(Zo.scale.linear(),Os,Ys)},Zo.text=St(function(n){return n.responseText}),Zo.json=function(n,t){return kt(n,&quot;application/json&quot;,Yo,t)},Zo.html=function(n,t){return kt(n,&quot;text/html&quot;,Io,t)},Zo.xml=St(function(n){return n.responseXML}),&quot;function&quot;==typeof define&amp;&amp;define.amd?define(Zo):&quot;object&quot;==typeof module&amp;&amp;module.exports&amp;&amp;(module.exports=Zo),this.d3=Zo}();
</ins><span class="cx">\ No newline at end of file
</span></span></pre></div>
<a id="trunkPerformanceTestsAnimometerresourcesdebugrunnergraphjsfromrev194406trunkPerformanceTestsAnimometerrunnerresourcesgraphjs"></a>
<div class="copfile"><h4>Copied: trunk/PerformanceTests/Animometer/resources/debug-runner/graph.js (from rev 194406, trunk/PerformanceTests/Animometer/runner/resources/graph.js) (0 => 194407)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/PerformanceTests/Animometer/resources/debug-runner/graph.js                                (rev 0)
+++ trunk/PerformanceTests/Animometer/resources/debug-runner/graph.js        2015-12-24 01:31:47 UTC (rev 194407)
</span><span class="lines">@@ -0,0 +1,142 @@
</span><ins>+function graph(selector, margins, axes, samples, samplingTimeOffset)
+{
+    var element = document.querySelector(selector);
+    element.innerHTML = '';
+
+    var size = Point.elementClientSize(element).subtract(margins.size);
+
+    var x = d3.scale.linear()
+            .range([0, size.width])
+            .domain(d3.extent(samples, function(d) { return d.timeOffset; }));            
+
+    var yLeft = d3.scale.linear()
+            .range([size.height, 0])
+            .domain([0, d3.max(samples, function(d) { return d.values[0]; })]);
+
+    var yRight = d3.scale.linear()
+            .range([size.height, 0])
+            .domain([0, d3.max(samples, function(d) { return d.values[1]; })]);
+
+    var xAxis = d3.svg.axis()
+            .scale(x)
+            .orient(&quot;bottom&quot;);
+
+    var yAxisLeft = d3.svg.axis()
+            .scale(yLeft)
+            .orient(&quot;left&quot;);
+
+    var yAxisRight = d3.svg.axis()
+            .scale(yRight)
+            .orient(&quot;right&quot;);
+
+    var lineLeft = d3.svg.line()
+            .x(function(d) { return x(d.timeOffset); })
+            .y(function(d) { return yLeft(d.values[0]); });
+
+    var lineRight = d3.svg.line()
+            .x(function(d) { return x(d.timeOffset); })
+            .y(function(d) { return yRight(d.values[1]); });
+
+    samples.forEach(function(d) {
+        d.timeOffset = +d.timeOffset;
+        d.values[0] = +d.values[0];
+        d.values[1] = +d.values[1];        
+    });    
+
+    var sampledSamples = samples.filter(function(d) {
+        return d.timeOffset &gt;= samplingTimeOffset;
+    });
+    
+    var meanLeft = d3.mean(sampledSamples, function(d) {
+        return +d.values[0];
+    });
+
+    var meanRight = d3.mean(sampledSamples, function(d) {
+        return +d.values[1];
+    });
+                            
+    var svg = d3.select(selector).append(&quot;svg&quot;)
+        .attr(&quot;width&quot;, size.width + margins.left + margins.right)
+        .attr(&quot;height&quot;, size.height + margins.top + margins.bottom)
+        .append(&quot;g&quot;)
+            .attr(&quot;transform&quot;, &quot;translate(&quot; + margins.left + &quot;,&quot; + margins.top + &quot;)&quot;);
+
+    // x-axis
+    svg.append(&quot;g&quot;)
+        .attr(&quot;class&quot;, &quot;x axis&quot;)
+        .attr(&quot;fill&quot;, &quot;rgb(235, 235, 235)&quot;)
+        .attr(&quot;transform&quot;, &quot;translate(0,&quot; + size.height + &quot;)&quot;)
+        .call(xAxis)
+        .append(&quot;text&quot;)
+            .attr(&quot;class&quot;, &quot;label&quot;)
+            .attr(&quot;x&quot;, size.width)
+            .attr(&quot;y&quot;, -6)
+            .attr(&quot;fill&quot;, &quot;rgb(235, 235, 235)&quot;)
+            .style(&quot;text-anchor&quot;, &quot;end&quot;)
+            .text(&quot;time&quot;);
+                 
+    // yLeft-axis
+    svg.append(&quot;g&quot;)
+        .attr(&quot;class&quot;, &quot;y axis&quot;)
+        .attr(&quot;fill&quot;, &quot;#7ADD49&quot;)
+        .call(yAxisLeft)
+        .append(&quot;text&quot;)
+            .attr(&quot;class&quot;, &quot;label&quot;)
+            .attr(&quot;transform&quot;, &quot;rotate(-90)&quot;)
+            .attr(&quot;y&quot;, 6)
+            .attr(&quot;fill&quot;, &quot;#7ADD49&quot;)
+            .attr(&quot;dy&quot;, &quot;.71em&quot;)
+            .style(&quot;text-anchor&quot;, &quot;end&quot;)
+            .text(axes[0]);
+
+    // yRight-axis
+    svg.append(&quot;g&quot;)
+        .attr(&quot;class&quot;, &quot;y axis&quot;)
+        .attr(&quot;fill&quot;, &quot;#FA4925&quot;)
+        .attr(&quot;transform&quot;, &quot;translate(&quot; + size.width + &quot;, 0)&quot;)
+        .call(yAxisRight)
+        .append(&quot;text&quot;)
+            .attr(&quot;class&quot;, &quot;label&quot;)
+            .attr(&quot;transform&quot;, &quot;rotate(-90)&quot;)
+            .attr(&quot;y&quot;, 6)
+            .attr(&quot;fill&quot;, &quot;#FA4925&quot;)
+            .attr(&quot;dy&quot;, &quot;.71em&quot;)
+            .style(&quot;text-anchor&quot;, &quot;end&quot;)
+            .text(axes[1]);
+
+    // left-mean
+    svg.append(&quot;svg:line&quot;)
+        .attr(&quot;x1&quot;, x(0))
+        .attr(&quot;x2&quot;, size.width)
+        .attr(&quot;y1&quot;, yLeft(meanLeft))
+        .attr(&quot;y2&quot;, yLeft(meanLeft))
+        .attr(&quot;class&quot;, &quot;left-mean&quot;);
+
+    // right-mean
+    svg.append(&quot;svg:line&quot;)
+        .attr(&quot;x1&quot;, x(0))
+        .attr(&quot;x2&quot;, size.width)
+        .attr(&quot;y1&quot;, yRight(meanRight))
+        .attr(&quot;y2&quot;, yRight(meanRight))
+        .attr(&quot;class&quot;, &quot;right-mean&quot;);        
+
+    // samplingTimeOffset
+    svg.append(&quot;line&quot;)
+        .attr(&quot;x1&quot;, x(samplingTimeOffset))
+        .attr(&quot;x2&quot;, x(samplingTimeOffset))
+        .attr(&quot;y1&quot;, yLeft(0))
+        .attr(&quot;y2&quot;, yLeft(yAxisLeft.scale().domain()[1]))
+        .attr(&quot;class&quot;, &quot;sample-time&quot;);
+
+    // left-samples
+    svg.append(&quot;path&quot;)
+        .datum(samples)
+        .attr(&quot;class&quot;, &quot;left-samples&quot;)
+        .attr(&quot;d&quot;, lineLeft);
+        
+    // right-samples
+    svg.append(&quot;path&quot;)
+        .datum(samples)
+        .attr(&quot;class&quot;, &quot;right-samples&quot;)
+        .attr(&quot;d&quot;, lineRight);
+}
</ins></span></pre></div>
<a id="trunkPerformanceTestsAnimometerresourcesdebugrunnertestsjsfromrev194406trunkPerformanceTestsAnimometerrunnerresourcestestsjs"></a>
<div class="copfile"><h4>Copied: trunk/PerformanceTests/Animometer/resources/debug-runner/tests.js (from rev 194406, trunk/PerformanceTests/Animometer/runner/resources/tests.js) (0 => 194407)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/PerformanceTests/Animometer/resources/debug-runner/tests.js                                (rev 0)
+++ trunk/PerformanceTests/Animometer/resources/debug-runner/tests.js        2015-12-24 01:31:47 UTC (rev 194407)
</span><span class="lines">@@ -0,0 +1,253 @@
</span><ins>+Utilities.extendObject(Headers, {
+    details: [
+        {
+            title: Strings.text.results.graph
+        },
+        {
+            title: Strings.text.experiments.complexity,
+            children:
+            [
+                {
+                    text: function(data) {
+                        return data[Strings.json.experiments.complexity][Strings.json.measurements.average].toFixed(2);
+                    },
+                    className: &quot;average&quot;
+                },
+                {
+                    text: function(data) {
+                        return [
+                            &quot;± &quot;,
+                            data[Strings.json.experiments.complexity][Strings.json.measurements.percent].toFixed(2),
+                            &quot;%&quot;
+                        ].join(&quot;&quot;);
+                    },
+                    className: function(data) {
+                        var className = &quot;stdev&quot;;
+
+                        if (data[Strings.json.experiments.complexity][Strings.json.measurements.percent] &gt;= 10)
+                            className += &quot; noisy-results&quot;;
+                        return className;
+                    }
+                }
+            ]
+        },
+        {
+            title: Strings.text.experiments.frameRate,
+            children:
+            [
+                {
+                    text: function(data) {
+                        return data[Strings.json.experiments.frameRate][Strings.json.measurements.average].toFixed(2);
+                    },
+                    className: function(data, options) {
+                        var className = &quot;average&quot;;
+                        if (Math.abs(data[Strings.json.experiments.frameRate][Strings.json.measurements.average] - options[&quot;frame-rate&quot;]) &gt;= 2)
+                            className += &quot; noisy-results&quot;;
+                        return className;
+                    }
+                },
+                {
+                    text: function(data) {
+                        var frameRateData = data[Strings.json.experiments.frameRate];
+                        return [
+                            &quot;± &quot;,
+                            frameRateData[Strings.json.measurements.percent].toFixed(2),
+                            &quot;%&quot;
+                        ].join(&quot;&quot;);
+                    },
+                    className: function(data) {
+                        var className = &quot;stdev&quot;;
+
+                        if (data[Strings.json.experiments.frameRate][Strings.json.measurements.percent] &gt;= 10)
+                            className += &quot; noisy-results&quot;;
+                        return className;
+                    }
+                }
+            ]
+        },
+    ]
+})
+
+///////////
+// Suites
+
+Suites.push(new Suite(&quot;HTML suite&quot;,
+    [
+        { 
+            url: &quot;bouncing-particles/bouncing-css-shapes.html?particleWidth=12&amp;particleHeight=12&amp;shape=circle&quot;,
+            name: &quot;CSS bouncing circles&quot;
+        },
+        { 
+            url: &quot;bouncing-particles/bouncing-css-shapes.html?particleWidth=40&amp;particleHeight=40&amp;shape=rect&amp;clip=star&quot;,
+            name: &quot;CSS bouncing clipped rects&quot;
+        },
+        { 
+            url: &quot;bouncing-particles/bouncing-css-shapes.html?particleWidth=50&amp;particleHeight=50&amp;shape=circle&amp;fill=gradient&quot;,
+            name: &quot;CSS bouncing gradient circles&quot;
+        },
+        {
+            url: &quot;bouncing-particles/bouncing-css-images.html?particleWidth=80&amp;particleHeight=80&amp;imageSrc=../resources/yin-yang.svg&quot;,
+            name: &quot;CSS bouncing SVG images&quot;
+        },
+        {
+            url: &quot;bouncing-particles/bouncing-css-images.html?particleWidth=80&amp;particleHeight=80&amp;imageSrc=../resources/yin-yang.png&quot;,
+            name: &quot;CSS bouncing PNG images&quot;
+        },
+        {
+            url: &quot;text/layering-text.html&quot;,
+            name: &quot;CSS layering text&quot;
+        },
+    ]
+));
+
+Suites.push(new Suite(&quot;Canvas suite&quot;,
+    [
+        { 
+            url: &quot;bouncing-particles/bouncing-canvas-shapes.html?particleWidth=12&amp;particleHeight=12&amp;shape=circle&quot;,
+            name: &quot;canvas bouncing circles&quot;
+        },
+        { 
+            url: &quot;bouncing-particles/bouncing-canvas-shapes.html?particleWidth=40&amp;particleHeight=40&amp;shape=rect&amp;clip=star&quot;,
+            name: &quot;canvas bouncing clipped rects&quot;
+        },
+        { 
+            url: &quot;bouncing-particles/bouncing-canvas-shapes.html?particleWidth=50&amp;particleHeight=50&amp;shape=circle&amp;fill=gradient&quot;,
+            name: &quot;canvas bouncing gradient circles&quot;
+        },
+        { 
+            url: &quot;bouncing-particles/bouncing-canvas-images.html?particleWidth=80&amp;particleHeight=80&amp;imageSrc=../resources/yin-yang.svg&quot;,
+            name: &quot;canvas bouncing SVG images&quot;
+        },
+        {
+            url: &quot;bouncing-particles/bouncing-canvas-images.html?particleWidth=80&amp;particleHeight=80&amp;imageSrc=../resources/yin-yang.png&quot;,
+            name: &quot;canvas bouncing PNG images&quot;
+        },
+    ]
+));
+
+Suites.push(new Suite(&quot;SVG suite&quot;,
+    [
+        {
+            url: &quot;bouncing-particles/bouncing-svg-shapes.html?particleWidth=12&amp;particleHeight=12&amp;shape=circle&quot;,
+            name: &quot;SVG bouncing circles&quot;,
+        },
+        {
+            url: &quot;bouncing-particles/bouncing-svg-shapes.html?particleWidth=40&amp;particleHeight=40&amp;shape=rect&amp;clip=star&quot;,
+            name: &quot;SVG bouncing clipped rects&quot;,
+        },
+        {
+            url: &quot;bouncing-particles/bouncing-svg-shapes.html?particleWidth=50&amp;particleHeight=50&amp;shape=circle&amp;fill=gradient&quot;,
+            name: &quot;SVG bouncing gradient circles&quot;
+        },
+        {
+            url: &quot;bouncing-particles/bouncing-svg-images.html?particleWidth=80&amp;particleHeight=80&amp;imageSrc=../resources/yin-yang.svg&quot;,
+            name: &quot;SVG bouncing SVG images&quot;
+        },
+        {
+            url: &quot;bouncing-particles/bouncing-svg-images.html?particleWidth=80&amp;particleHeight=80&amp;imageSrc=../resources/yin-yang.png&quot;,
+            name: &quot;SVG bouncing PNG images&quot;
+        },
+    ]
+));
+
+Suites.push(new Suite(&quot;Basic canvas path suite&quot;,
+    [
+        {
+            url: &quot;simple/simple-canvas-paths.html?pathType=line&amp;lineCap=butt&quot;,
+            name: &quot;Canvas line segments, butt caps&quot;
+        },
+        {
+            url: &quot;simple/simple-canvas-paths.html?pathType=line&amp;lineCap=round&quot;,
+            name: &quot;Canvas line segments, round caps&quot;
+        },
+        {
+            url: &quot;simple/simple-canvas-paths.html?pathType=line&amp;lineCap=square&quot;,
+            name: &quot;Canvas line segments, square caps&quot;
+        },
+        {
+            url: &quot;simple/simple-canvas-paths.html?pathType=linePath&amp;lineJoin=bevel&quot;,
+            name: &quot;Canvas line path, bevel join&quot;
+        },
+        {
+            url: &quot;simple/simple-canvas-paths.html?pathType=linePath&amp;lineJoin=round&quot;,
+            name: &quot;Canvas line path, round join&quot;
+        },
+        {
+            url: &quot;simple/simple-canvas-paths.html?pathType=linePath&amp;lineJoin=miter&quot;,
+            name: &quot;Canvas line path, miter join&quot;
+        },
+        {
+            url: &quot;simple/simple-canvas-paths.html?pathType=linePath&amp;lineDash=1&quot;,
+            name: &quot;Canvas line path with dash pattern&quot;
+        },
+        {
+            url: &quot;simple/simple-canvas-paths.html?pathType=quadratic&quot;,
+            name: &quot;Canvas quadratic segments&quot;
+        },
+        {
+            url: &quot;simple/simple-canvas-paths.html?pathType=quadraticPath&quot;,
+            name: &quot;Canvas quadratic path&quot;
+        },
+        {
+            url: &quot;simple/simple-canvas-paths.html?pathType=bezier&quot;,
+            name: &quot;Canvas bezier segments&quot;
+        },
+        {
+            url: &quot;simple/simple-canvas-paths.html?pathType=bezierPath&quot;,
+            name: &quot;Canvas bezier path&quot;
+        },
+        {
+            url: &quot;simple/simple-canvas-paths.html?&amp;pathType=arcTo&quot;,
+            name: &quot;Canvas arcTo segments&quot;
+        },
+        {
+            url: &quot;simple/simple-canvas-paths.html?pathType=arc&quot;,
+            name: &quot;Canvas arc segments&quot;
+        },
+        {
+            url: &quot;simple/simple-canvas-paths.html?pathType=rect&quot;,
+            name: &quot;Canvas rects&quot;
+        },
+        {
+            url: &quot;simple/simple-canvas-paths.html?pathType=lineFill&quot;,
+            name: &quot;Canvas line path, fill&quot;
+        },
+        {
+            url: &quot;simple/simple-canvas-paths.html?pathType=quadraticFill&quot;,
+            name: &quot;Canvas quadratic path, fill&quot;
+        },
+        {
+            url: &quot;simple/simple-canvas-paths.html?pathType=bezierFill&quot;,
+            name: &quot;Canvas bezier path, fill&quot;
+        },
+        {
+            url: &quot;simple/simple-canvas-paths.html?&amp;pathType=arcToFill&quot;,
+            name: &quot;Canvas arcTo segments, fill&quot;
+        },
+        {
+            url: &quot;simple/simple-canvas-paths.html?pathType=arcFill&quot;,
+            name: &quot;Canvas arc segments, fill&quot;
+        },
+        {
+            url: &quot;simple/simple-canvas-paths.html?pathType=rectFill&quot;,
+            name: &quot;Canvas rects, fill&quot;
+        }
+    ]
+));
+
+Suites.push(new Suite(&quot;Miscellaneous Tests&quot;,
+    [
+        {
+            url: &quot;misc/compositing-transforms.html?particleWidth=50&amp;particleHeight=50&amp;filters=yes&amp;imageSrc=../resources/yin-yang.svg&quot;,
+            name: &quot;Composited Transforms&quot;
+        },
+        {
+            url: &quot;examples/canvas-electrons.html&quot;,
+            name: &quot;canvas electrons&quot;
+        },
+        {
+            url: &quot;examples/canvas-stars.html&quot;,
+            name: &quot;canvas stars&quot;
+        },
+    ]
+));
</ins></span></pre></div>
<a id="trunkPerformanceTestsAnimometerresourcesextensionsjs"></a>
<div class="modfile"><h4>Modified: trunk/PerformanceTests/Animometer/resources/extensions.js (194406 => 194407)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/PerformanceTests/Animometer/resources/extensions.js        2015-12-24 01:10:55 UTC (rev 194406)
+++ trunk/PerformanceTests/Animometer/resources/extensions.js        2015-12-24 01:31:47 UTC (rev 194407)
</span><span class="lines">@@ -1,3 +1,53 @@
</span><ins>+Array.prototype.swap = function(i, j)
+{
+    var t = this[i];
+    this[i] = this[j];
+    this[j] = t;
+    return this;
+}
+
+if (!Array.prototype.fill) {
+    Array.prototype.fill = function(value) {
+        if (this == null)
+            throw new TypeError('Array.prototype.fill called on null or undefined');
+
+        var object = Object(this);
+        var len = parseInt(object.length, 10);
+        var start = arguments[1];
+        var relativeStart = parseInt(start, 10) || 0;
+        var k = relativeStart &lt; 0 ? Math.max(len + relativeStart, 0) : Math.min(relativeStart, len);
+        var end = arguments[2];
+        var relativeEnd = end === undefined ? len : (parseInt(end) || 0) ;
+        var final = relativeEnd &lt; 0 ? Math.max(len + relativeEnd, 0) : Math.min(relativeEnd, len);
+
+        for (; k &lt; final; k++)
+            object[k] = value;
+
+        return object;
+    };
+}
+
+if (!Array.prototype.find) {
+    Array.prototype.find = function(predicate) {
+        if (this == null)
+            throw new TypeError('Array.prototype.find called on null or undefined');
+        if (typeof predicate !== 'function')
+            throw new TypeError('predicate must be a function');
+
+        var list = Object(this);
+        var length = list.length &gt;&gt;&gt; 0;
+        var thisArg = arguments[1];
+        var value;
+
+        for (var i = 0; i &lt; length; i++) {
+            value = list[i];
+            if (predicate.call(thisArg, value, i, list))
+                return value;
+        }
+        return undefined;
+    };
+}
+
</ins><span class="cx"> function Point(x, y)
</span><span class="cx"> {
</span><span class="cx">     this.x = x;
</span><span class="lines">@@ -134,7 +184,7 @@
</span><span class="cx"> 
</span><span class="cx"> window.DocumentExtension =
</span><span class="cx"> {
</span><del>-    createElement : function(name, attrs, parentElement)
</del><ins>+    createElement: function(name, attrs, parentElement)
</ins><span class="cx">     {
</span><span class="cx">         var element = document.createElement(name);
</span><span class="cx"> 
</span><span class="lines">@@ -191,6 +241,7 @@
</span><span class="cx"> function ResultsDashboard()
</span><span class="cx"> {
</span><span class="cx">     this._iterationsSamplers = [];
</span><ins>+    this._processedData = undefined;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> ResultsDashboard.prototype =
</span><span class="lines">@@ -200,7 +251,7 @@
</span><span class="cx">         this._iterationsSamplers.push(suitesSamplers);        
</span><span class="cx">     },
</span><span class="cx">     
</span><del>-    toJSON: function(statistics, graph)
</del><ins>+    _processData: function(statistics, graph)
</ins><span class="cx">     {
</span><span class="cx">         var iterationsResults = [];
</span><span class="cx">         var iterationsScores = [];
</span><span class="lines">@@ -211,14 +262,13 @@
</span><span class="cx">         
</span><span class="cx">             for (var suiteName in iterationSamplers) {
</span><span class="cx">                 var suite = suiteFromName(suiteName);
</span><del>-                var suiteSamplers = iterationSamplers[suiteName];
</del><ins>+                var suiteSamplerData = iterationSamplers[suiteName];
</ins><span class="cx"> 
</span><span class="cx">                 var testsResults = {};
</span><span class="cx">                 var testsScores = [];
</span><span class="cx">                 
</span><del>-                for (var testName in suiteSamplers) {
-                    var sampler = suiteSamplers[testName];
-                    testsResults[testName] = sampler.toJSON(statistics, graph);
</del><ins>+                for (var testName in suiteSamplerData) {
+                    testsResults[testName] = suiteSamplerData[testName];
</ins><span class="cx">                     testsScores.push(testsResults[testName][Strings.json.score]);
</span><span class="cx">                 }
</span><span class="cx"> 
</span><span class="lines">@@ -234,10 +284,22 @@
</span><span class="cx">             iterationsScores.push(iterationsResults[index][Strings.json.score]);
</span><span class="cx">         });
</span><span class="cx"> 
</span><del>-        var json = {};
-        json[Strings.json.score] = Statistics.sampleMean(iterationsScores.length, iterationsScores.reduce(function(a, b) { return a * b; }));
-        json[Strings.json.results.iterations] = iterationsResults;
-        return json;
</del><ins>+        this._processedData = {};
+        this._processedData[Strings.json.score] = Statistics.sampleMean(iterationsScores.length, iterationsScores.reduce(function(a, b) { return a * b; }));
+        this._processedData[Strings.json.results.iterations] = iterationsResults;
+    },
+
+    get data()
+    {
+        if (this._processedData)
+            return this._processedData;
+        this._processData(true, true);
+        return this._processedData;
+    },
+
+    get score()
+    {
+        return this.data[Strings.json.score];
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -245,6 +307,15 @@
</span><span class="cx"> {
</span><span class="cx">     this.element = element;
</span><span class="cx">     this._headers = headers;
</span><ins>+
+    this._flattenedHeaders = [];
+    this._headers.forEach(function(header) {
+        if (header.children)
+            this._flattenedHeaders = this._flattenedHeaders.concat(header.children);
+        else
+            this._flattenedHeaders.push(header);
+    }, this);
+
</ins><span class="cx">     this.clear();
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -255,112 +326,49 @@
</span><span class="cx">         this.element.innerHTML = &quot;&quot;;
</span><span class="cx">     },
</span><span class="cx"> 
</span><del>-    _showHeaderRow: function(row, queue, headers, message)
</del><ins>+    _addHeader: function()
</ins><span class="cx">     {
</span><del>-        headers.forEach(function (header) {
-            var th = DocumentExtension.createElement(&quot;th&quot;, {}, row);
-            th.textContent = header.text;
-            if (typeof message != &quot;undefined&quot; &amp;&amp; message.length) {
-                th.innerHTML += &quot;&lt;br&gt;&quot; + '[' + message +']';
-                message = &quot;&quot;;
-            }
-            if (&quot;width&quot; in header)
-                th.width = header.width + &quot;%&quot;;
-            queue.push({element: th, headers: header.children });
-        });
-    },
-
-    _showHeader: function(message)
-    {
</del><span class="cx">         var thead = DocumentExtension.createElement(&quot;thead&quot;, {}, this.element);
</span><span class="cx">         var row = DocumentExtension.createElement(&quot;tr&quot;, {}, thead);
</span><span class="cx"> 
</span><del>-        var queue = [];
-        this._showHeaderRow(row, queue, this._headers, message);
-
-        while (queue.length) {
-            var row = null;
-            var entries = [];
-
-            for (var i = 0, len = queue.length; i &lt; len; ++i) {
-                var entry = queue.shift();
-
-                if (!entry.headers.length) {
-                    entries.push(entry.element);
-                    continue;
-                }
-
-                if (!row)
-                    row = DocumentExtension.createElement(&quot;tr&quot;, {}, thead);
-
-                this._showHeaderRow(row, queue, entry.headers, &quot;&quot;);
-                entry.element.colSpan = entry.headers.length;
-            }
-
-            if (row) {
-                entries.forEach(function(entry) {
-                    ++entry.rowSpan;
-                });
-            }
-        }
</del><ins>+        this._headers.forEach(function (header) {
+            var th = DocumentExtension.createElement(&quot;th&quot;, {}, row);
+            if (header.title != Strings.text.results.graph)
+                th.textContent = header.title;
+            if (header.children)
+                th.colSpan = header.children.length;
+        });
</ins><span class="cx">     },
</span><del>-    
-    _showEmptyCell: function(row, className)
-    {
-        return DocumentExtension.createElement(&quot;td&quot;, { class: className }, row);
-    },
</del><span class="cx"> 
</span><del>-    _showText: function(row, text, className)
</del><ins>+    _addGraphButton: function(td, testName, testResults)
</ins><span class="cx">     {
</span><del>-        var td = DocumentExtension.createElement(&quot;td&quot;, { class: className }, row);
-        td.textContent = text;
-    },
-
-    _showFixedNumber: function(row, value, digits, className)
-    {
-        var td = DocumentExtension.createElement(&quot;td&quot;, { class: className }, row);
-        td.textContent = value.toFixed(digits || 2);
-    },
-    
-    _showGraph: function(row, testName, testResults)
-    {
</del><span class="cx">         var data = testResults[Strings.json.samples];
</span><del>-        if (!data) {
-            this._showEmptyCell(row, &quot;&quot;);
</del><ins>+        if (!data)
</ins><span class="cx">             return;
</span><del>-        }
</del><span class="cx">         
</span><del>-        var td = DocumentExtension.createElement(&quot;td&quot;, {}, row);
</del><span class="cx">         var button = DocumentExtension.createElement(&quot;button&quot;, { class: &quot;small-button&quot; }, td);
</span><span class="cx"> 
</span><span class="cx">         button.addEventListener(&quot;click&quot;, function() {
</span><span class="cx">             var samples = data[Strings.json.graph.points];
</span><span class="cx">             var samplingTimeOffset = data[Strings.json.graph.samplingTimeOffset];
</span><span class="cx">             var axes = [Strings.text.experiments.complexity, Strings.text.experiments.frameRate];
</span><del>-            benchmarkController.showTestGraph(testName, axes, samples, samplingTimeOffset);
</del><ins>+            var score = testResults[Strings.json.score].toFixed(2);
+            var complexity = testResults[Strings.json.experiments.complexity];
+            var mean = [
+                &quot;mean: &quot;,
+                complexity[Strings.json.measurements.average].toFixed(2),
+                &quot; Â± &quot;,
+                complexity[Strings.json.measurements.stdev].toFixed(2),
+                &quot; (&quot;,
+                complexity[Strings.json.measurements.percent].toFixed(2),
+                &quot;%), worst 5%: &quot;,
+                complexity[Strings.json.measurements.concern].toFixed(2)].join(&quot;&quot;);
+            benchmarkController.showTestGraph(testName, score, mean, axes, samples, samplingTimeOffset);
</ins><span class="cx">         });
</span><span class="cx">             
</span><span class="cx">         button.textContent = Strings.text.results.graph + &quot;...&quot;;
</span><span class="cx">     },
</span><span class="cx"> 
</span><del>-    _showJSON: function(row, testName, testResults)
-    {
-        var data = testResults[Strings.json.samples];
-        if (!data) {
-            this._showEmptyCell(row, &quot;&quot;);
-            return;
-        }
-
-        var td = DocumentExtension.createElement(&quot;td&quot;, {}, row);
-        var button = DocumentExtension.createElement(&quot;button&quot;, { class: &quot;small-button&quot; }, td);
-
-        button.addEventListener(&quot;click&quot;, function() {
-            benchmarkController.showTestJSON(testName, testResults);
-        });
-            
-        button.textContent = Strings.text.results.json + &quot;...&quot;;
-    },
-    
</del><span class="cx">     _isNoisyMeasurement: function(jsonExperiment, data, measurement, options)
</span><span class="cx">     {
</span><span class="cx">         const percentThreshold = 10;
</span><span class="lines">@@ -375,99 +383,128 @@
</span><span class="cx">         return false;
</span><span class="cx">     },
</span><span class="cx"> 
</span><del>-    _isNoisyTest: function(testResults, options)
</del><ins>+    _addEmptyRow: function()
</ins><span class="cx">     {
</span><del>-        for (var index = 0; index &lt; 2; ++index) {
-            var jsonExperiment = !index ? Strings.json.experiments.complexity : Strings.json.experiments.frameRate;
-            var data = testResults[jsonExperiment];
-            for (var measurement in data) {
-                if (this._isNoisyMeasurement(jsonExperiment, data, measurement, options))
-                    return true;
-            }
-        }
-        return false;
-    },
-
-    _showEmptyCells: function(row, headers)
-    {
-        for (var index = 0; index &lt; headers.length; ++index) {
-            if (!headers[index].children.length)
-                this._showEmptyCell(row, &quot;suites-separator&quot;);
-            else
-                this._showEmptyCells(row, headers[index].children);
-        }
-    },
-
-    _showEmptyRow: function()
-    {
</del><span class="cx">         var row = DocumentExtension.createElement(&quot;tr&quot;, {}, this.element);
</span><del>-        this._showEmptyCells(row, this._headers);
</del><ins>+        this._flattenedHeaders.forEach(function (header) {
+            return DocumentExtension.createElement(&quot;td&quot;, { class: &quot;suites-separator&quot; }, row);
+        });
</ins><span class="cx">     },
</span><span class="cx"> 
</span><del>-    _showTest: function(testName, testResults, options)
</del><ins>+    _addTest: function(testName, testResults, options)
</ins><span class="cx">     {
</span><span class="cx">         var row = DocumentExtension.createElement(&quot;tr&quot;, {}, this.element);
</span><del>-        var className = this._isNoisyTest(testResults, options) ? &quot;noisy-results&quot; : &quot;&quot;;
-        
-        for (var index = 0; index &lt; this._headers.length; ++index) {
</del><span class="cx"> 
</span><del>-            switch (index) {
-            case 0:
-                this._showText(row, testName, className);
-                break;
</del><ins>+        var isNoisy = false;
+        [Strings.json.experiments.complexity, Strings.json.experiments.frameRate].forEach(function (experiment) {
+            var data = testResults[experiment];
+            for (var measurement in data) {
+                if (this._isNoisyMeasurement(experiment, data, measurement, options))
+                    isNoisy = true;
+            }
+        }, this);
</ins><span class="cx"> 
</span><del>-            case 1:
-                var data = testResults[Strings.json.score];
-                this._showFixedNumber(row, data, 2);
-                break;
</del><ins>+        this._flattenedHeaders.forEach(function (header) {
+            var className = &quot;&quot;;
+            if (header.className) {
+                if (typeof header.className == &quot;function&quot;)
+                    className = header.className(testResults, options);
+                else
+                    className = header.className;
+            }
</ins><span class="cx"> 
</span><del>-            case 2:
-            case 3:
-                var jsonExperiment = index == 2 ? Strings.json.experiments.complexity : Strings.json.experiments.frameRate;
-                var data = testResults[jsonExperiment];
-                for (var measurement in data)
-                    this._showFixedNumber(row, data[measurement], 2, this._isNoisyMeasurement(jsonExperiment, data, measurement, options) ? className : &quot;&quot;);
-                break;
-                
-            case 4:
-                this._showGraph(row, testName, testResults);
-                this._showJSON(row, testName, testResults);
-                break;
</del><ins>+            if (header.title == Strings.text.testName) {
+                var titleClassName = className;
+                if (isNoisy)
+                    titleClassName += &quot; noisy-results&quot;;
+                var td = DocumentExtension.createElement(&quot;td&quot;, { class: titleClassName }, row);
+                td.textContent = testName;
+                return;
</ins><span class="cx">             }
</span><del>-        }
</del><ins>+
+            var td = DocumentExtension.createElement(&quot;td&quot;, { class: className }, row);
+            if (header.title == Strings.text.results.graph) {
+                this._addGraphButton(td, testName, testResults);
+            } else if (!(&quot;text&quot; in header)) {
+                td.textContent = testResults[header.title];
+            } else if (typeof header.text == &quot;string&quot;) {
+                var data = testResults[header.text];
+                if (typeof data == &quot;number&quot;)
+                    data = data.toFixed(2);
+                td.textContent = data;
+            } else {
+                td.textContent = header.text(testResults, testName);
+            }
+        }, this);
</ins><span class="cx">     },
</span><span class="cx"> 
</span><del>-    _showSuite: function(suiteName, suiteResults, options)
</del><ins>+    _addSuite: function(suiteName, suiteResults, options)
</ins><span class="cx">     {
</span><span class="cx">         for (var testName in suiteResults[Strings.json.results.tests]) {
</span><del>-            this._showTest(testName, suiteResults[Strings.json.results.tests][testName], options);
</del><ins>+            var testResults = suiteResults[Strings.json.results.tests][testName];
+            this._addTest(testName, testResults, options);
</ins><span class="cx">         }
</span><span class="cx">     },
</span><span class="cx">     
</span><del>-    _showIteration : function(iterationResults, options)
</del><ins>+    _addIteration: function(iterationResult, options)
</ins><span class="cx">     {
</span><del>-        for (var suiteName in iterationResults[Strings.json.results.suites]) {
-            if (suiteName != Object.keys(iterationResults[Strings.json.results.suites])[0])
-                this._showEmptyRow();
-            this._showSuite(suiteName, iterationResults[Strings.json.results.suites][suiteName], options);
</del><ins>+        for (var suiteName in iterationResult[Strings.json.results.suites]) {
+            this._addEmptyRow();
+            this._addSuite(suiteName, iterationResult[Strings.json.results.suites][suiteName], options);
</ins><span class="cx">         }
</span><span class="cx">     },
</span><del>-    
-    showRecord: function(testName, message, testResults, options)
-    {
-        this.clear();
-        this._showHeader(message);
-        this._showTest(testName, testResults, options);
-    },
</del><span class="cx"> 
</span><span class="cx">     showIterations: function(iterationsResults, options)
</span><span class="cx">     {
</span><span class="cx">         this.clear();
</span><del>-        this._showHeader(&quot;&quot;);
</del><ins>+        this._addHeader();
</ins><span class="cx">         
</span><del>-        iterationsResults.forEach(function(iterationResults) {
-            this._showIteration(iterationResults, options);
</del><ins>+        iterationsResults.forEach(function(iterationResult) {
+            this._addIteration(iterationResult, options);
</ins><span class="cx">         }, this);
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+window.Utilities =
+{
+    _parse: function(str, sep)
+    {
+        var output = {};
+        str.split(sep).forEach(function(part) {
+            var item = part.split(&quot;=&quot;);
+            var value = decodeURIComponent(item[1]);
+            if (value[0] == &quot;'&quot; )
+                output[item[0]] = value.substr(1, value.length - 2);
+            else
+                output[item[0]] = value;
+          });
+        return output;
+    },
+
+    parseParameters: function()
+    {
+        return this._parse(window.location.search.substr(1), &quot;&amp;&quot;);
+    },
+
+    parseArguments: function(str)
+    {
+        return this._parse(str, &quot; &quot;);
+    },
+
+    extendObject: function(obj1, obj2)
+    {
+        for (var attrname in obj2)
+            obj1[attrname] = obj2[attrname];
+        return obj1;
+    },
+
+    copyObject: function(obj)
+    {
+        return this.extendObject({}, obj);
+    },
+
+    mergeObjects: function(obj1, obj2)
+    {
+        return this.extendObject(this.copyObject(obj1), obj2);
+    }
+}
</ins></span></pre></div>
<a id="trunkPerformanceTestsAnimometerresourcesrunneranimometercss"></a>
<div class="addfile"><h4>Added: trunk/PerformanceTests/Animometer/resources/runner/animometer.css (0 => 194407)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/PerformanceTests/Animometer/resources/runner/animometer.css                                (rev 0)
+++ trunk/PerformanceTests/Animometer/resources/runner/animometer.css        2015-12-24 01:31:47 UTC (rev 194407)
</span><span class="lines">@@ -0,0 +1,242 @@
</span><ins>+/* Outer harness */
+html,body {
+    height: 100%;
+    margin: 0px;
+    padding: 0px;
+}
+
+body {
+    background-color: rgb(241, 241, 241);
+    color: rgb(96, 96, 96);
+    font-family: -apple-system, &quot;Helvetica Neue&quot;, Helvetica, Verdana, sans-serif;
+}
+
+main {
+    width: 100%;
+    height: 100%;
+
+    display: flex;
+    align-items: center;
+    justify-content: flex-start;
+    flex-flow: column;
+}
+
+hr {
+    flex: 1 0 20px;
+    width: 1px;
+    border: 0;
+    margin: 0;
+}
+
+section {
+    box-sizing: border-box;
+    width: 100%;
+    display: none;
+}
+
+section.selected {
+    display: initial;
+}
+
+h1 {
+    font-size: 3em;
+    text-align: center;
+    font-weight: 600;
+    margin: 10vh 0;
+    flex: 0 1 1em;
+}
+
+button {
+    flex: 0 0 auto;
+    display: block;
+    font-size: 1.5em;
+    margin-bottom: 10vh;
+    border: 2px solid rgb(96, 96, 96);
+    color: rgb(96, 96, 96);
+    background: transparent;
+    border-radius: 10px;
+    padding: .5em 2em;
+}
+
+button:hover {
+    background-color: rgba(0, 0, 0, .1);
+    cursor: pointer;
+}
+
+button:active {
+    color: inherit;
+    background-color: rgba(0, 0, 0, .2);
+}
+
+
+@media screen and (min-device-width: 768px) {
+    section {
+        padding: 0 20px;
+    }
+
+    section.selected {
+        display: flex;
+        align-items: center;
+        justify-content: flex-start;
+        flex-flow: column;
+    }
+}
+
+@media screen and (max-device-width: 414px) {
+    h1 {
+        font-size: 2.5em;
+    }
+
+    hr {
+        flex: 0 0 0;
+    }
+
+    section {
+        box-sizing: border-box;
+        width: 100%;
+        height: 100%;
+        align-self: stretch;
+        padding: 0 5px;
+    }
+}
+
+/* Intro section */
+#intro.selected {
+    flex: 1 0 auto;
+}
+
+#intro p {
+    flex: 1 1 auto;
+    padding: 0 0 10vh 0;
+    font-size: 2em;
+}
+
+@media screen and (min-device-width: 768px) {
+    #intro p {
+        max-width: 800px;
+        margin: 0;
+    }
+}
+
+@media screen and (max-device-width: 414px) {
+    #intro.selected {
+        display: flex;
+        align-items: center;
+        justify-content: flex-start;
+        flex-flow: column;
+    }
+
+    #intro p {
+        padding-left: 20px;
+        padding-right: 20px;
+        font-size: 1.5em;
+    }
+}
+
+/* Running test section */
+#test-container.selected {
+    display: flex;
+
+    align-items: center;
+    justify-content: center;
+}
+
+.frame-container &gt; iframe {
+    width: 1200px;
+    height: 600px;
+    border: 0;
+    margin: 0 auto;
+}
+
+@media screen and (min-device-width: 1800px) {
+    .frame-container &gt; iframe {
+        width: 1600px;
+        height: 800px;
+    }
+}
+
+@media screen and (max-device-width: 414px) {
+    #test-container {
+        padding: 0;
+    }
+
+    .frame-container {
+        width: 100%;
+        height: 100%;
+        overflow: hidden;
+    }
+
+    .frame-container &gt; iframe {
+        width: 100%;
+        height: 100%;
+    }
+}
+
+@media screen and (max-device-width: 1024px) {
+    .frame-container &gt; iframe {
+        width: 900px;
+    }
+}
+
+/* Results section */
+#results {
+    text-align: center;
+}
+
+#results.selected {
+    flex: 1 0 auto;
+}
+
+.score {
+    font-size: 5em;
+    font-weight: bold;
+    margin: 0;
+}
+
+#results-tables {
+    direction: rtl;
+
+    display: flex;
+
+    align-items: center;
+    justify-content: center;
+
+    margin: 3em 0;
+}
+
+#results table {
+    direction: ltr;
+    border-spacing: 0;
+}
+
+#results th {
+    padding: .5em 0;
+}
+
+#results tr td {
+    padding: .25em 0;
+}
+
+#results-header td, #results-header th {
+    text-align: left;
+}
+#results-header tr td {
+    padding-right: 1em;
+}
+#results-score td, #results-score th {
+    text-align: right;
+}
+
+@media screen and (max-device-width: 414px) {
+    #results.selected {
+        padding: 0 20px;
+        display: flex;
+        align-items: center;
+        justify-content: flex-start;
+        flex-flow: column;
+    }
+
+    .score {
+        font-size: 3em;
+    }
+}
</ins></span></pre></div>
<a id="trunkPerformanceTestsAnimometerresourcesrunneranimometerjs"></a>
<div class="addfile"><h4>Added: trunk/PerformanceTests/Animometer/resources/runner/animometer.js (0 => 194407)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/PerformanceTests/Animometer/resources/runner/animometer.js                                (rev 0)
+++ trunk/PerformanceTests/Animometer/resources/runner/animometer.js        2015-12-24 01:31:47 UTC (rev 194407)
</span><span class="lines">@@ -0,0 +1,123 @@
</span><ins>+window.benchmarkRunnerClient = {
+    iterationCount: 1,
+    options: null,
+    results: null,
+
+    initialize: function(suites, options)
+    {
+        this.testsCount = this.iterationCount * suites.reduce(function (count, suite) { return count + suite.tests.length; }, 0);
+        this.options = options;
+    },
+
+    willStartFirstIteration: function()
+    {
+        this.results = new ResultsDashboard();
+    },
+
+    didRunSuites: function(suitesSamplers)
+    {
+        this.results.push(suitesSamplers);
+    },
+
+    didFinishLastIteration: function()
+    {
+        benchmarkController.showResults();
+    }
+};
+
+window.sectionsManager =
+{
+    showSection: function(sectionIdentifier, pushState)
+    {
+        var currentSectionElement = document.querySelector(&quot;section.selected&quot;);
+        console.assert(currentSectionElement);
+
+        var newSectionElement = document.getElementById(sectionIdentifier);
+        console.assert(newSectionElement);
+
+        currentSectionElement.classList.remove(&quot;selected&quot;);
+        newSectionElement.classList.add(&quot;selected&quot;);
+
+        if (pushState)
+            history.pushState({section: sectionIdentifier}, document.title);
+    },
+
+    setSectionScore: function(sectionIdentifier, score, mean)
+    {
+        document.querySelector(&quot;#&quot; + sectionIdentifier + &quot; .score&quot;).textContent = score;
+        if (mean)
+            document.querySelector(&quot;#&quot; + sectionIdentifier + &quot; .mean&quot;).innerHTML = mean;
+    },
+
+    populateTable: function(tableIdentifier, headers, data)
+    {
+        var table = new ResultsTable(document.getElementById(tableIdentifier), headers);
+        table.showIterations(data, benchmarkRunnerClient.options);
+    }
+};
+
+window.benchmarkController = {
+    _startBenchmark: function(suites, options, frameContainerID)
+    {
+        benchmarkRunnerClient.initialize(suites, options);
+        var frameContainer = document.getElementById(frameContainerID);
+        var runner = new BenchmarkRunner(suites, frameContainer, benchmarkRunnerClient);
+        runner.runMultipleIterations();
+
+        sectionsManager.showSection(&quot;test-container&quot;);
+    },
+
+    startBenchmark: function()
+    {
+        var options = {
+            &quot;test-interval&quot;: 10,
+            &quot;display&quot;: &quot;minimal&quot;,
+            &quot;adjustment&quot;: &quot;adaptive&quot;,
+            &quot;frame-rate&quot;: 50,
+            &quot;estimated-frame-rate&quot;: true
+        };
+        this._startBenchmark(Suites, options, &quot;test-container&quot;);
+    },
+
+    showResults: function()
+    {
+        if (!this.addedKeyEvent) {
+            document.addEventListener(&quot;keypress&quot;, this.selectResults, false);
+            this.addedKeyEvent = true;
+        }
+
+        sectionsManager.setSectionScore(&quot;results&quot;, benchmarkRunnerClient.results.score.toFixed(2));
+        var data = benchmarkRunnerClient.results.data[Strings.json.results.iterations];
+        sectionsManager.populateTable(&quot;results-header&quot;, Headers.testName, data);
+        sectionsManager.populateTable(&quot;results-score&quot;, Headers.score, data);
+        sectionsManager.showSection(&quot;results&quot;, true);
+    },
+
+    selectResults: function(event)
+    {
+        if (event.charCode != 115) // 's'
+            return;
+
+        event.target.selectRange = ((event.target.selectRange || 0) + 1) % 3;
+
+        var selection = window.getSelection();
+        selection.removeAllRanges();
+        var range = document.createRange();
+        switch (event.target.selectRange) {
+            case 0: {
+                range.setStart(document.querySelector(&quot;#results .score&quot;), 0);
+                range.setEndAfter(document.querySelector(&quot;#results-score &gt; tr:last-of-type&quot;), 0);
+                break;
+            }
+            case 1: {
+                range.selectNodeContents(document.querySelector(&quot;#results .score&quot;));
+                break;
+            }
+            case 2: {
+                range.selectNode(document.getElementById(&quot;results-score&quot;));
+                break;
+            }
+        }
+        selection.addRange(range);
+    }
+};
</ins></span></pre></div>
<a id="trunkPerformanceTestsAnimometerresourcesrunnertestsjs"></a>
<div class="addfile"><h4>Added: trunk/PerformanceTests/Animometer/resources/runner/tests.js (0 => 194407)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/PerformanceTests/Animometer/resources/runner/tests.js                                (rev 0)
+++ trunk/PerformanceTests/Animometer/resources/runner/tests.js        2015-12-24 01:31:47 UTC (rev 194407)
</span><span class="lines">@@ -0,0 +1,36 @@
</span><ins>+var Headers = {
+    testName: [{ title: Strings.text.testName }],
+    score: [{ title: Strings.text.score, text: Strings.json.score }]
+};
+
+var Suite = function(name, tests) {
+    this.name = name;
+    this.tests = tests;
+};
+Suite.prototype.prepare = function(runner, contentWindow, contentDocument)
+{
+    return runner.waitForElement(&quot;#stage&quot;).then(function (element) {
+        return element;
+    });
+};
+Suite.prototype.run = function(contentWindow, test, options, progressBar)
+{
+    return contentWindow.runBenchmark(this, test, options, progressBar);
+};
+
+var Suites = [];
+
+Suites.push(new Suite(&quot;Animometer&quot;,
+    [
+    ]
+));
+
+function suiteFromName(name)
+{
+    return Suites.find(function(suite) { return suite.name == name; });
+}
+
+function testFromName(suite, name)
+{
+    return suite.tests.find(function(test) { return test.name == name; });
+}
</ins></span></pre></div>
<a id="trunkPerformanceTestsAnimometertestsbouncingparticlesbouncingcanvasimageshtml"></a>
<div class="modfile"><h4>Modified: trunk/PerformanceTests/Animometer/tests/bouncing-particles/bouncing-canvas-images.html (194406 => 194407)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/PerformanceTests/Animometer/tests/bouncing-particles/bouncing-canvas-images.html        2015-12-24 01:10:55 UTC (rev 194406)
+++ trunk/PerformanceTests/Animometer/tests/bouncing-particles/bouncing-canvas-images.html        2015-12-24 01:31:47 UTC (rev 194407)
</span><span class="lines">@@ -13,7 +13,6 @@
</span><span class="cx">     &lt;script src=&quot;../../resources/sampler.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;../../resources/extensions.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;../resources/math.js&quot;&gt;&lt;/script&gt;
</span><del>-    &lt;script src=&quot;../resources/utilities.js&quot;&gt;&lt;/script&gt;    
</del><span class="cx">     &lt;script src=&quot;../resources/main.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;../resources/stage.js&quot;&gt;&lt;/script&gt;  
</span><span class="cx">     &lt;script src=&quot;resources/bouncing-particles.js&quot;&gt;&lt;/script&gt;
</span></span></pre></div>
<a id="trunkPerformanceTestsAnimometertestsbouncingparticlesbouncingcanvasshapeshtml"></a>
<div class="modfile"><h4>Modified: trunk/PerformanceTests/Animometer/tests/bouncing-particles/bouncing-canvas-shapes.html (194406 => 194407)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/PerformanceTests/Animometer/tests/bouncing-particles/bouncing-canvas-shapes.html        2015-12-24 01:10:55 UTC (rev 194406)
+++ trunk/PerformanceTests/Animometer/tests/bouncing-particles/bouncing-canvas-shapes.html        2015-12-24 01:31:47 UTC (rev 194407)
</span><span class="lines">@@ -7,7 +7,6 @@
</span><span class="cx">     &lt;script src=&quot;../../resources/sampler.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;../../resources/extensions.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;../resources/math.js&quot;&gt;&lt;/script&gt;
</span><del>-    &lt;script src=&quot;../resources/utilities.js&quot;&gt;&lt;/script&gt;    
</del><span class="cx">     &lt;script src=&quot;../resources/main.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;../resources/stage.js&quot;&gt;&lt;/script&gt;  
</span><span class="cx">     &lt;script src=&quot;resources/bouncing-particles.js&quot;&gt;&lt;/script&gt;
</span></span></pre></div>
<a id="trunkPerformanceTestsAnimometertestsbouncingparticlesbouncingcssimageshtml"></a>
<div class="modfile"><h4>Modified: trunk/PerformanceTests/Animometer/tests/bouncing-particles/bouncing-css-images.html (194406 => 194407)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/PerformanceTests/Animometer/tests/bouncing-particles/bouncing-css-images.html        2015-12-24 01:10:55 UTC (rev 194406)
+++ trunk/PerformanceTests/Animometer/tests/bouncing-particles/bouncing-css-images.html        2015-12-24 01:31:47 UTC (rev 194407)
</span><span class="lines">@@ -12,7 +12,6 @@
</span><span class="cx">     &lt;script src=&quot;../../resources/sampler.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;../../resources/extensions.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;../resources/math.js&quot;&gt;&lt;/script&gt;
</span><del>-    &lt;script src=&quot;../resources/utilities.js&quot;&gt;&lt;/script&gt;    
</del><span class="cx">     &lt;script src=&quot;../resources/main.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;../resources/stage.js&quot;&gt;&lt;/script&gt;  
</span><span class="cx">     &lt;script src=&quot;resources/bouncing-particles.js&quot;&gt;&lt;/script&gt;
</span></span></pre></div>
<a id="trunkPerformanceTestsAnimometertestsbouncingparticlesbouncingcssshapeshtml"></a>
<div class="modfile"><h4>Modified: trunk/PerformanceTests/Animometer/tests/bouncing-particles/bouncing-css-shapes.html (194406 => 194407)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/PerformanceTests/Animometer/tests/bouncing-particles/bouncing-css-shapes.html        2015-12-24 01:10:55 UTC (rev 194406)
+++ trunk/PerformanceTests/Animometer/tests/bouncing-particles/bouncing-css-shapes.html        2015-12-24 01:31:47 UTC (rev 194407)
</span><span class="lines">@@ -23,7 +23,6 @@
</span><span class="cx">     &lt;script src=&quot;../../resources/sampler.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;../../resources/extensions.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;../resources/math.js&quot;&gt;&lt;/script&gt;
</span><del>-    &lt;script src=&quot;../resources/utilities.js&quot;&gt;&lt;/script&gt;    
</del><span class="cx">     &lt;script src=&quot;../resources/main.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;../resources/stage.js&quot;&gt;&lt;/script&gt;  
</span><span class="cx">     &lt;script src=&quot;resources/bouncing-particles.js&quot;&gt;&lt;/script&gt;
</span></span></pre></div>
<a id="trunkPerformanceTestsAnimometertestsbouncingparticlesbouncingsvgimageshtml"></a>
<div class="modfile"><h4>Modified: trunk/PerformanceTests/Animometer/tests/bouncing-particles/bouncing-svg-images.html (194406 => 194407)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/PerformanceTests/Animometer/tests/bouncing-particles/bouncing-svg-images.html        2015-12-24 01:10:55 UTC (rev 194406)
+++ trunk/PerformanceTests/Animometer/tests/bouncing-particles/bouncing-svg-images.html        2015-12-24 01:31:47 UTC (rev 194407)
</span><span class="lines">@@ -7,7 +7,6 @@
</span><span class="cx">     &lt;script src=&quot;../../resources/sampler.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;../../resources/extensions.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;../resources/math.js&quot;&gt;&lt;/script&gt;
</span><del>-    &lt;script src=&quot;../resources/utilities.js&quot;&gt;&lt;/script&gt;    
</del><span class="cx">     &lt;script src=&quot;../resources/main.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;../resources/stage.js&quot;&gt;&lt;/script&gt;  
</span><span class="cx">     &lt;script src=&quot;resources/bouncing-particles.js&quot;&gt;&lt;/script&gt;
</span></span></pre></div>
<a id="trunkPerformanceTestsAnimometertestsbouncingparticlesbouncingsvgshapeshtml"></a>
<div class="modfile"><h4>Modified: trunk/PerformanceTests/Animometer/tests/bouncing-particles/bouncing-svg-shapes.html (194406 => 194407)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/PerformanceTests/Animometer/tests/bouncing-particles/bouncing-svg-shapes.html        2015-12-24 01:10:55 UTC (rev 194406)
+++ trunk/PerformanceTests/Animometer/tests/bouncing-particles/bouncing-svg-shapes.html        2015-12-24 01:31:47 UTC (rev 194407)
</span><span class="lines">@@ -7,7 +7,6 @@
</span><span class="cx">     &lt;script src=&quot;../../resources/sampler.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;../../resources/extensions.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;../resources/math.js&quot;&gt;&lt;/script&gt;
</span><del>-    &lt;script src=&quot;../resources/utilities.js&quot;&gt;&lt;/script&gt;    
</del><span class="cx">     &lt;script src=&quot;../resources/main.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;../resources/stage.js&quot;&gt;&lt;/script&gt;  
</span><span class="cx">     &lt;script src=&quot;resources/bouncing-particles.js&quot;&gt;&lt;/script&gt;
</span></span></pre></div>
<a id="trunkPerformanceTestsAnimometertestsbouncingparticlesresourcesbouncingcanvasimagesjs"></a>
<div class="modfile"><h4>Modified: trunk/PerformanceTests/Animometer/tests/bouncing-particles/resources/bouncing-canvas-images.js (194406 => 194407)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/PerformanceTests/Animometer/tests/bouncing-particles/resources/bouncing-canvas-images.js        2015-12-24 01:10:55 UTC (rev 194406)
+++ trunk/PerformanceTests/Animometer/tests/bouncing-particles/resources/bouncing-canvas-images.js        2015-12-24 01:31:47 UTC (rev 194407)
</span><span class="lines">@@ -32,9 +32,9 @@
</span><span class="cx">     return new BouncingCanvasImage(this);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-function BouncingCanvasImagesBenchmark(suite, test, options, recordTable, progressBar)
</del><ins>+function BouncingCanvasImagesBenchmark(suite, test, options, progressBar)
</ins><span class="cx"> {
</span><del>-    BouncingCanvasParticlesBenchmark.call(this, suite, test, options, recordTable, progressBar);
</del><ins>+    BouncingCanvasParticlesBenchmark.call(this, suite, test, options, progressBar);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> BouncingCanvasImagesBenchmark.prototype = Object.create(BouncingCanvasParticlesBenchmark.prototype);
</span><span class="lines">@@ -45,7 +45,7 @@
</span><span class="cx">     return new BouncingCanvasImagesStage(element, this._options);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-window.benchmarkClient.create = function(suite, test, options, recordTable, progressBar)
</del><ins>+window.benchmarkClient.create = function(suite, test, options, progressBar)
</ins><span class="cx"> {
</span><del>-    return new BouncingCanvasImagesBenchmark(suite, test, options, recordTable, progressBar);
</del><ins>+    return new BouncingCanvasImagesBenchmark(suite, test, options, progressBar);
</ins><span class="cx"> }
</span></span></pre></div>
<a id="trunkPerformanceTestsAnimometertestsbouncingparticlesresourcesbouncingcanvasparticlesjs"></a>
<div class="modfile"><h4>Modified: trunk/PerformanceTests/Animometer/tests/bouncing-particles/resources/bouncing-canvas-particles.js (194406 => 194407)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/PerformanceTests/Animometer/tests/bouncing-particles/resources/bouncing-canvas-particles.js        2015-12-24 01:10:55 UTC (rev 194406)
+++ trunk/PerformanceTests/Animometer/tests/bouncing-particles/resources/bouncing-canvas-particles.js        2015-12-24 01:31:47 UTC (rev 194407)
</span><span class="lines">@@ -91,9 +91,9 @@
</span><span class="cx">     return BouncingParticlesAnimator.prototype.animate.call(this);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-function BouncingCanvasParticlesBenchmark(suite, test, options, recordTable, progressBar)
</del><ins>+function BouncingCanvasParticlesBenchmark(suite, test, options, progressBar)
</ins><span class="cx"> {
</span><del>-    StageBenchmark.call(this, suite, test, options, recordTable, progressBar);
</del><ins>+    StageBenchmark.call(this, suite, test, options, progressBar);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> BouncingCanvasParticlesBenchmark.prototype = Object.create(StageBenchmark.prototype);
</span></span></pre></div>
<a id="trunkPerformanceTestsAnimometertestsbouncingparticlesresourcesbouncingcanvasshapesjs"></a>
<div class="modfile"><h4>Modified: trunk/PerformanceTests/Animometer/tests/bouncing-particles/resources/bouncing-canvas-shapes.js (194406 => 194407)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/PerformanceTests/Animometer/tests/bouncing-particles/resources/bouncing-canvas-shapes.js        2015-12-24 01:10:55 UTC (rev 194406)
+++ trunk/PerformanceTests/Animometer/tests/bouncing-particles/resources/bouncing-canvas-shapes.js        2015-12-24 01:31:47 UTC (rev 194407)
</span><span class="lines">@@ -71,9 +71,9 @@
</span><span class="cx">     return new BouncingCanvasShape(this);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-function BouncingCanvasShapesBenchmark(suite, test, options, recordTable, progressBar)
</del><ins>+function BouncingCanvasShapesBenchmark(suite, test, options, progressBar)
</ins><span class="cx"> {
</span><del>-    BouncingCanvasParticlesBenchmark.call(this, suite, test, options, recordTable, progressBar);
</del><ins>+    BouncingCanvasParticlesBenchmark.call(this, suite, test, options, progressBar);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> BouncingCanvasShapesBenchmark.prototype = Object.create(BouncingCanvasParticlesBenchmark.prototype);
</span><span class="lines">@@ -84,7 +84,7 @@
</span><span class="cx">     return new BouncingCanvasShapesStage(element, this._options);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-window.benchmarkClient.create = function(suite, test, options, recordTable, progressBar)
</del><ins>+window.benchmarkClient.create = function(suite, test, options, progressBar)
</ins><span class="cx"> {
</span><del>-    return new BouncingCanvasShapesBenchmark(suite, test, options, recordTable, progressBar);
</del><ins>+    return new BouncingCanvasShapesBenchmark(suite, test, options, progressBar);
</ins><span class="cx"> }
</span></span></pre></div>
<a id="trunkPerformanceTestsAnimometertestsbouncingparticlesresourcesbouncingcssimagesjs"></a>
<div class="modfile"><h4>Modified: trunk/PerformanceTests/Animometer/tests/bouncing-particles/resources/bouncing-css-images.js (194406 => 194407)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/PerformanceTests/Animometer/tests/bouncing-particles/resources/bouncing-css-images.js        2015-12-24 01:10:55 UTC (rev 194406)
+++ trunk/PerformanceTests/Animometer/tests/bouncing-particles/resources/bouncing-css-images.js        2015-12-24 01:31:47 UTC (rev 194407)
</span><span class="lines">@@ -44,9 +44,9 @@
</span><span class="cx">     particle.element.remove();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-function BouncingCssImagesBenchmark(suite, test, options, recordTable, progressBar)
</del><ins>+function BouncingCssImagesBenchmark(suite, test, options, progressBar)
</ins><span class="cx"> {
</span><del>-    BouncingParticlesBenchmark.call(this, suite, test, options, recordTable, progressBar);
</del><ins>+    BouncingParticlesBenchmark.call(this, suite, test, options, progressBar);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> BouncingCssImagesBenchmark.prototype = Object.create(BouncingParticlesBenchmark.prototype);
</span><span class="lines">@@ -57,7 +57,7 @@
</span><span class="cx">     return new BouncingCssImagesStage(element, this._options);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-window.benchmarkClient.create = function(suite, test, options, recordTable, progressBar)
</del><ins>+window.benchmarkClient.create = function(suite, test, options, progressBar)
</ins><span class="cx"> {
</span><del>-    return new BouncingCssImagesBenchmark(suite, test, options, recordTable, progressBar);
</del><ins>+    return new BouncingCssImagesBenchmark(suite, test, options, progressBar);
</ins><span class="cx"> }
</span></span></pre></div>
<a id="trunkPerformanceTestsAnimometertestsbouncingparticlesresourcesbouncingcssshapesjs"></a>
<div class="modfile"><h4>Modified: trunk/PerformanceTests/Animometer/tests/bouncing-particles/resources/bouncing-css-shapes.js (194406 => 194407)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/PerformanceTests/Animometer/tests/bouncing-particles/resources/bouncing-css-shapes.js        2015-12-24 01:10:55 UTC (rev 194406)
+++ trunk/PerformanceTests/Animometer/tests/bouncing-particles/resources/bouncing-css-shapes.js        2015-12-24 01:31:47 UTC (rev 194407)
</span><span class="lines">@@ -62,9 +62,9 @@
</span><span class="cx">     particle.element.remove();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-function BouncingCssShapesBenchmark(suite, test, options, recordTable, progressBar)
</del><ins>+function BouncingCssShapesBenchmark(suite, test, options, progressBar)
</ins><span class="cx"> {
</span><del>-    BouncingParticlesBenchmark.call(this, suite, test, options, recordTable, progressBar);
</del><ins>+    BouncingParticlesBenchmark.call(this, suite, test, options, progressBar);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> BouncingCssShapesBenchmark.prototype = Object.create(BouncingParticlesBenchmark.prototype);
</span><span class="lines">@@ -75,7 +75,7 @@
</span><span class="cx">     return new BouncingCssShapesStage(element, this._options);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-window.benchmarkClient.create = function(suite, test, options, recordTable, progressBar)
</del><ins>+window.benchmarkClient.create = function(suite, test, options, progressBar)
</ins><span class="cx"> {
</span><del>-    return new BouncingCssShapesBenchmark(suite, test, options, recordTable, progressBar);
</del><ins>+    return new BouncingCssShapesBenchmark(suite, test, options, progressBar);
</ins><span class="cx"> }
</span></span></pre></div>
<a id="trunkPerformanceTestsAnimometertestsbouncingparticlesresourcesbouncingparticlesjs"></a>
<div class="modfile"><h4>Modified: trunk/PerformanceTests/Animometer/tests/bouncing-particles/resources/bouncing-particles.js (194406 => 194407)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/PerformanceTests/Animometer/tests/bouncing-particles/resources/bouncing-particles.js        2015-12-24 01:10:55 UTC (rev 194406)
+++ trunk/PerformanceTests/Animometer/tests/bouncing-particles/resources/bouncing-particles.js        2015-12-24 01:31:47 UTC (rev 194407)
</span><span class="lines">@@ -124,9 +124,9 @@
</span><span class="cx">     return this._particles.length;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-function BouncingParticlesBenchmark(suite, test, options, recordTable, progressBar)
</del><ins>+function BouncingParticlesBenchmark(suite, test, options, progressBar)
</ins><span class="cx"> {
</span><del>-    StageBenchmark.call(this, suite, test, options, recordTable, progressBar);
</del><ins>+    StageBenchmark.call(this, suite, test, options, progressBar);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> BouncingParticlesBenchmark.prototype = Object.create(StageBenchmark.prototype);
</span></span></pre></div>
<a id="trunkPerformanceTestsAnimometertestsbouncingparticlesresourcesbouncingsvgimagesjs"></a>
<div class="modfile"><h4>Modified: trunk/PerformanceTests/Animometer/tests/bouncing-particles/resources/bouncing-svg-images.js (194406 => 194407)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/PerformanceTests/Animometer/tests/bouncing-particles/resources/bouncing-svg-images.js        2015-12-24 01:10:55 UTC (rev 194406)
+++ trunk/PerformanceTests/Animometer/tests/bouncing-particles/resources/bouncing-svg-images.js        2015-12-24 01:31:47 UTC (rev 194407)
</span><span class="lines">@@ -26,9 +26,9 @@
</span><span class="cx">     return new BouncingSvgImage(this);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-function BouncingSvgImagesBenchmark(suite, test, options, recordTable, progressBar)
</del><ins>+function BouncingSvgImagesBenchmark(suite, test, options, progressBar)
</ins><span class="cx"> {
</span><del>-    BouncingParticlesBenchmark.call(this, suite, test, options, recordTable, progressBar);
</del><ins>+    BouncingParticlesBenchmark.call(this, suite, test, options, progressBar);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> BouncingSvgImagesBenchmark.prototype = Object.create(BouncingParticlesBenchmark.prototype);
</span><span class="lines">@@ -39,7 +39,7 @@
</span><span class="cx">     return new BouncingSvgImagesStage(element, this._options);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-window.benchmarkClient.create = function(suite, test, options, recordTable, progressBar)
</del><ins>+window.benchmarkClient.create = function(suite, test, options, progressBar)
</ins><span class="cx"> {
</span><del>-    return new BouncingSvgImagesBenchmark(suite, test, options, recordTable, progressBar);
</del><ins>+    return new BouncingSvgImagesBenchmark(suite, test, options, progressBar);
</ins><span class="cx"> }
</span></span></pre></div>
<a id="trunkPerformanceTestsAnimometertestsbouncingparticlesresourcesbouncingsvgshapesjs"></a>
<div class="modfile"><h4>Modified: trunk/PerformanceTests/Animometer/tests/bouncing-particles/resources/bouncing-svg-shapes.js (194406 => 194407)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/PerformanceTests/Animometer/tests/bouncing-particles/resources/bouncing-svg-shapes.js        2015-12-24 01:10:55 UTC (rev 194406)
+++ trunk/PerformanceTests/Animometer/tests/bouncing-particles/resources/bouncing-svg-shapes.js        2015-12-24 01:31:47 UTC (rev 194407)
</span><span class="lines">@@ -85,9 +85,9 @@
</span><span class="cx">     this._ensureDefsIsCreated().removeChild(gradient);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-function BouncingSvgShapesBenchmark(suite, test, options, recordTable, progressBar)
</del><ins>+function BouncingSvgShapesBenchmark(suite, test, options, progressBar)
</ins><span class="cx"> {
</span><del>-    BouncingParticlesBenchmark.call(this, suite, test, options, recordTable, progressBar);
</del><ins>+    BouncingParticlesBenchmark.call(this, suite, test, options, progressBar);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> BouncingSvgShapesBenchmark.prototype = Object.create(BouncingParticlesBenchmark.prototype);
</span><span class="lines">@@ -98,7 +98,7 @@
</span><span class="cx">     return new BouncingSvgShapesStage(element, this._options);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-window.benchmarkClient.create = function(suite, test, options, recordTable, progressBar)
</del><ins>+window.benchmarkClient.create = function(suite, test, options, progressBar)
</ins><span class="cx"> {
</span><del>-    return new BouncingSvgShapesBenchmark(suite, test, options, recordTable, progressBar);
</del><ins>+    return new BouncingSvgShapesBenchmark(suite, test, options, progressBar);
</ins><span class="cx"> }
</span></span></pre></div>
<a id="trunkPerformanceTestsAnimometertestsexamplescanvaselectronshtml"></a>
<div class="modfile"><h4>Modified: trunk/PerformanceTests/Animometer/tests/examples/canvas-electrons.html (194406 => 194407)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/PerformanceTests/Animometer/tests/examples/canvas-electrons.html        2015-12-24 01:10:55 UTC (rev 194406)
+++ trunk/PerformanceTests/Animometer/tests/examples/canvas-electrons.html        2015-12-24 01:31:47 UTC (rev 194407)
</span><span class="lines">@@ -7,7 +7,6 @@
</span><span class="cx">     &lt;script src=&quot;../../resources/sampler.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;../../resources/extensions.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;../resources/math.js&quot;&gt;&lt;/script&gt;
</span><del>-    &lt;script src=&quot;../resources/utilities.js&quot;&gt;&lt;/script&gt;    
</del><span class="cx">     &lt;script src=&quot;../resources/main.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;../resources/stage.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;resources/canvas-electrons.js&quot;&gt;&lt;/script&gt;
</span></span></pre></div>
<a id="trunkPerformanceTestsAnimometertestsexamplescanvasstarshtml"></a>
<div class="modfile"><h4>Modified: trunk/PerformanceTests/Animometer/tests/examples/canvas-stars.html (194406 => 194407)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/PerformanceTests/Animometer/tests/examples/canvas-stars.html        2015-12-24 01:10:55 UTC (rev 194406)
+++ trunk/PerformanceTests/Animometer/tests/examples/canvas-stars.html        2015-12-24 01:31:47 UTC (rev 194407)
</span><span class="lines">@@ -7,7 +7,6 @@
</span><span class="cx">     &lt;script src=&quot;../../resources/sampler.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;../../resources/extensions.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;../resources/math.js&quot;&gt;&lt;/script&gt;
</span><del>-    &lt;script src=&quot;../resources/utilities.js&quot;&gt;&lt;/script&gt;    
</del><span class="cx">     &lt;script src=&quot;../resources/main.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;../resources/stage.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;resources/canvas-stars.js&quot;&gt;&lt;/script&gt;
</span></span></pre></div>
<a id="trunkPerformanceTestsAnimometertestsexamplesresourcescanvaselectronsjs"></a>
<div class="modfile"><h4>Modified: trunk/PerformanceTests/Animometer/tests/examples/resources/canvas-electrons.js (194406 => 194407)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/PerformanceTests/Animometer/tests/examples/resources/canvas-electrons.js        2015-12-24 01:10:55 UTC (rev 194406)
+++ trunk/PerformanceTests/Animometer/tests/examples/resources/canvas-electrons.js        2015-12-24 01:31:47 UTC (rev 194407)
</span><span class="lines">@@ -104,9 +104,9 @@
</span><span class="cx">     return StageAnimator.prototype.animate.call(this);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-function CanvasElectronsBenchmark(suite, test, options, recordTable, progressBar)
</del><ins>+function CanvasElectronsBenchmark(suite, test, options, progressBar)
</ins><span class="cx"> {
</span><del>-    StageBenchmark.call(this, suite, test, options, recordTable, progressBar);
</del><ins>+    StageBenchmark.call(this, suite, test, options, progressBar);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> CanvasElectronsBenchmark.prototype = Object.create(StageBenchmark.prototype);
</span><span class="lines">@@ -124,9 +124,9 @@
</span><span class="cx">     return new CanvasElectronsAnimator(this, this._options);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-window.benchmarkClient.create = function(suite, test, options, recordTable, progressBar)
</del><ins>+window.benchmarkClient.create = function(suite, test, options, progressBar)
</ins><span class="cx"> {
</span><span class="cx">     // This function is called from the test harness which starts the
</span><span class="cx">     // test by creating your benchmark object.
</span><del>-    return new CanvasElectronsBenchmark(suite, test, options, recordTable, progressBar);
</del><ins>+    return new CanvasElectronsBenchmark(suite, test, options, progressBar);
</ins><span class="cx"> }
</span></span></pre></div>
<a id="trunkPerformanceTestsAnimometertestsexamplesresourcescanvasstarsjs"></a>
<div class="modfile"><h4>Modified: trunk/PerformanceTests/Animometer/tests/examples/resources/canvas-stars.js (194406 => 194407)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/PerformanceTests/Animometer/tests/examples/resources/canvas-stars.js        2015-12-24 01:10:55 UTC (rev 194406)
+++ trunk/PerformanceTests/Animometer/tests/examples/resources/canvas-stars.js        2015-12-24 01:31:47 UTC (rev 194407)
</span><span class="lines">@@ -101,9 +101,9 @@
</span><span class="cx">    return StageAnimator.prototype.animate.call(this);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-function CanvasStarsBenchmark(suite, test, options, recordTable, progressBar)
</del><ins>+function CanvasStarsBenchmark(suite, test, options, progressBar)
</ins><span class="cx"> {
</span><del>-   StageBenchmark.call(this, suite, test, options, recordTable, progressBar);
</del><ins>+   StageBenchmark.call(this, suite, test, options, progressBar);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> CanvasStarsBenchmark.prototype = Object.create(StageBenchmark.prototype);
</span><span class="lines">@@ -121,9 +121,9 @@
</span><span class="cx">    return new CanvasStarsAnimator(this, this._options);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-window.benchmarkClient.create = function(suite, test, options, recordTable, progressBar)
</del><ins>+window.benchmarkClient.create = function(suite, test, options, progressBar)
</ins><span class="cx"> {
</span><span class="cx">    // This function is called from the test harness which starts the
</span><span class="cx">    // test by creating your benchmark object.
</span><del>-   return new CanvasStarsBenchmark(suite, test, options, recordTable, progressBar);
</del><ins>+   return new CanvasStarsBenchmark(suite, test, options, progressBar);
</ins><span class="cx"> }
</span><span class="cx">\ No newline at end of file
</span></span></pre></div>
<a id="trunkPerformanceTestsAnimometertestsmisccompositingtransformshtml"></a>
<div class="modfile"><h4>Modified: trunk/PerformanceTests/Animometer/tests/misc/compositing-transforms.html (194406 => 194407)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/PerformanceTests/Animometer/tests/misc/compositing-transforms.html        2015-12-24 01:10:55 UTC (rev 194406)
+++ trunk/PerformanceTests/Animometer/tests/misc/compositing-transforms.html        2015-12-24 01:31:47 UTC (rev 194407)
</span><span class="lines">@@ -14,7 +14,6 @@
</span><span class="cx">     &lt;script src=&quot;../../resources/sampler.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;../../resources/extensions.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;../resources/math.js&quot;&gt;&lt;/script&gt;
</span><del>-    &lt;script src=&quot;../resources/utilities.js&quot;&gt;&lt;/script&gt;    
</del><span class="cx">     &lt;script src=&quot;../resources/main.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;../resources/stage.js&quot;&gt;&lt;/script&gt;  
</span><span class="cx">     &lt;script src=&quot;../bouncing-particles/resources/bouncing-particles.js&quot;&gt;&lt;/script&gt;
</span></span></pre></div>
<a id="trunkPerformanceTestsAnimometertestsmiscresourcescompositingtransformsjs"></a>
<div class="modfile"><h4>Modified: trunk/PerformanceTests/Animometer/tests/misc/resources/compositing-transforms.js (194406 => 194407)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/PerformanceTests/Animometer/tests/misc/resources/compositing-transforms.js        2015-12-24 01:10:55 UTC (rev 194406)
+++ trunk/PerformanceTests/Animometer/tests/misc/resources/compositing-transforms.js        2015-12-24 01:31:47 UTC (rev 194407)
</span><span class="lines">@@ -48,9 +48,9 @@
</span><span class="cx">     particle.element.remove();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-function CompositedTransformsBenchmark(suite, test, options, recordTable, progressBar)
</del><ins>+function CompositedTransformsBenchmark(suite, test, options, progressBar)
</ins><span class="cx"> {
</span><del>-    BouncingParticlesBenchmark.call(this, suite, test, options, recordTable, progressBar);
</del><ins>+    BouncingParticlesBenchmark.call(this, suite, test, options, progressBar);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> CompositedTransformsBenchmark.prototype = Object.create(BouncingParticlesBenchmark.prototype);
</span><span class="lines">@@ -61,7 +61,7 @@
</span><span class="cx">     return new CompositingTransformsStage(element, this._options);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-window.benchmarkClient.create = function(suite, test, options, recordTable, progressBar)
</del><ins>+window.benchmarkClient.create = function(suite, test, options, progressBar)
</ins><span class="cx"> {
</span><del>-    return new CompositedTransformsBenchmark(suite, test, options, recordTable, progressBar);
</del><ins>+    return new CompositedTransformsBenchmark(suite, test, options, progressBar);
</ins><span class="cx"> }
</span></span></pre></div>
<a id="trunkPerformanceTestsAnimometertestsresourcesmainjs"></a>
<div class="modfile"><h4>Modified: trunk/PerformanceTests/Animometer/tests/resources/main.js (194406 => 194407)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/PerformanceTests/Animometer/tests/resources/main.js        2015-12-24 01:10:55 UTC (rev 194406)
+++ trunk/PerformanceTests/Animometer/tests/resources/main.js        2015-12-24 01:31:47 UTC (rev 194407)
</span><span class="lines">@@ -195,7 +195,7 @@
</span><span class="cx">         if (stage != BenchmarkState.stages.FINISHED &amp;&amp; currentTimeOffset &lt; this._recordTimeOffset + this._recordInterval)
</span><span class="cx">             return;
</span><span class="cx"> 
</span><del>-        this.showResults(this._state.currentMessage(), this._state.currentProgress());
</del><ins>+        this.showResults(this._state.currentProgress(), this._state.currentMessage());
</ins><span class="cx">         this._recordTimeOffset = currentTimeOffset;
</span><span class="cx">     },
</span><span class="cx">     
</span><span class="lines">@@ -228,11 +228,11 @@
</span><span class="cx"> });
</span><span class="cx"> 
</span><span class="cx"> // This function is called from the suite controller run-callback when running the benchmark runner.
</span><del>-window.runBenchmark = function(suite, test, options, recordTable, progressBar)
</del><ins>+window.runBenchmark = function(suite, test, options, progressBar)
</ins><span class="cx"> {
</span><span class="cx">     var benchmarkOptions = { complexity: test.complexity };
</span><span class="cx">     benchmarkOptions = Utilities.mergeObjects(benchmarkOptions, options);
</span><span class="cx">     benchmarkOptions = Utilities.mergeObjects(benchmarkOptions, Utilities.parseParameters());
</span><del>-    window.benchmark = window.benchmarkClient.create(suite, test, benchmarkOptions, recordTable, progressBar);
</del><ins>+    window.benchmark = window.benchmarkClient.create(suite, test, benchmarkOptions, progressBar);
</ins><span class="cx">     return window.benchmark.run();
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkPerformanceTestsAnimometertestsresourcesstagejs"></a>
<div class="modfile"><h4>Modified: trunk/PerformanceTests/Animometer/tests/resources/stage.js (194406 => 194407)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/PerformanceTests/Animometer/tests/resources/stage.js        2015-12-24 01:10:55 UTC (rev 194406)
+++ trunk/PerformanceTests/Animometer/tests/resources/stage.js        2015-12-24 01:31:47 UTC (rev 194407)
</span><span class="lines">@@ -128,7 +128,7 @@
</span><span class="cx">     return true;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-function StageBenchmark(suite, test, options, recordTable, progressBar)
</del><ins>+function StageBenchmark(suite, test, options, progressBar)
</ins><span class="cx"> {
</span><span class="cx">     Benchmark.call(this, options);
</span><span class="cx">     
</span><span class="lines">@@ -140,7 +140,6 @@
</span><span class="cx">     this._animator = this.createAnimator();
</span><span class="cx">     this._suite = suite;
</span><span class="cx">     this._test = test;
</span><del>-    this._recordTable = recordTable;
</del><span class="cx">     this._progressBar = progressBar;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -167,13 +166,10 @@
</span><span class="cx">     return this._stage.clear();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-StageBenchmark.prototype.showResults = function(message, progress)
</del><ins>+StageBenchmark.prototype.showResults = function(progress, message)
</ins><span class="cx"> {
</span><del>-    if (!this._recordTable || !this._progressBar || !this._test)
</del><ins>+    if (!this._progressBar || !this._test)
</ins><span class="cx">         return;
</span><span class="cx"> 
</span><del>-    if (this._options[&quot;display&quot;] == &quot;statistics-table&quot;)
-        this._recordTable.showRecord(this._test.name, message, this._sampler.toJSON(true, false), this._options);
-
</del><span class="cx">     this._progressBar.setPos(progress);
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkPerformanceTestsAnimometertestsresourcesutilitiesjs"></a>
<div class="delfile"><h4>Deleted: trunk/PerformanceTests/Animometer/tests/resources/utilities.js (194406 => 194407)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/PerformanceTests/Animometer/tests/resources/utilities.js        2015-12-24 01:10:55 UTC (rev 194406)
+++ trunk/PerformanceTests/Animometer/tests/resources/utilities.js        2015-12-24 01:31:47 UTC (rev 194407)
</span><span class="lines">@@ -1,43 +0,0 @@
</span><del>-window.Utilities =
-{
-    _parse: function(str, sep)
-    {
-        var output = {};
-        str.split(sep).forEach(function(part) {
-            var item = part.split(&quot;=&quot;);
-            var value = decodeURIComponent(item[1]);
-            if (value[0] == &quot;'&quot; )
-                output[item[0]] = value.substr(1, value.length - 2);
-            else
-                output[item[0]] = value;                
-          });
-        return output;
-    },
-    
-    parseParameters: function()
-    {
-        return this._parse(window.location.search.substr(1), &quot;&amp;&quot;);
-    },
-    
-    parseArguments: function(str)
-    {
-        return this._parse(str, &quot; &quot;);
-    },
-    
-    extendObject: function(obj1, obj2)
-    {
-        for (var attrname in obj2)
-            obj1[attrname] = obj2[attrname];
-        return obj1;
-    },
-    
-    copyObject: function(obj)
-    {
-        return this.extendObject({}, obj);
-    },
-    
-    mergeObjects: function(obj1, obj2)
-    {
-        return this.extendObject(this.copyObject(obj1), obj2);
-    }
-}
</del></span></pre></div>
<a id="trunkPerformanceTestsAnimometertestssimpleresourcessimplecanvaspathsjs"></a>
<div class="modfile"><h4>Modified: trunk/PerformanceTests/Animometer/tests/simple/resources/simple-canvas-paths.js (194406 => 194407)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/PerformanceTests/Animometer/tests/simple/resources/simple-canvas-paths.js        2015-12-24 01:10:55 UTC (rev 194406)
+++ trunk/PerformanceTests/Animometer/tests/simple/resources/simple-canvas-paths.js        2015-12-24 01:31:47 UTC (rev 194407)
</span><span class="lines">@@ -244,8 +244,8 @@
</span><span class="cx"> 
</span><span class="cx"> // === BENCHMARK ===
</span><span class="cx"> 
</span><del>-function CanvasPathBenchmark(suite, test, options, recordTable, progressBar) {
-    SimpleCanvasBenchmark.call(this, suite, test, options, recordTable, progressBar);
</del><ins>+function CanvasPathBenchmark(suite, test, options, progressBar) {
+    SimpleCanvasBenchmark.call(this, suite, test, options, progressBar);
</ins><span class="cx"> }
</span><span class="cx"> CanvasPathBenchmark.prototype = Object.create(SimpleCanvasBenchmark.prototype);
</span><span class="cx"> CanvasPathBenchmark.prototype.constructor = CanvasPathBenchmark;
</span><span class="lines">@@ -290,6 +290,6 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-window.benchmarkClient.create = function(suite, test, options, recordTable, progressBar) {
-    return new CanvasPathBenchmark(suite, test, options, recordTable, progressBar);
</del><ins>+window.benchmarkClient.create = function(suite, test, options, progressBar) {
+    return new CanvasPathBenchmark(suite, test, options, progressBar);
</ins><span class="cx"> }
</span></span></pre></div>
<a id="trunkPerformanceTestsAnimometertestssimpleresourcessimplecanvasjs"></a>
<div class="modfile"><h4>Modified: trunk/PerformanceTests/Animometer/tests/simple/resources/simple-canvas.js (194406 => 194407)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/PerformanceTests/Animometer/tests/simple/resources/simple-canvas.js        2015-12-24 01:10:55 UTC (rev 194406)
+++ trunk/PerformanceTests/Animometer/tests/simple/resources/simple-canvas.js        2015-12-24 01:31:47 UTC (rev 194407)
</span><span class="lines">@@ -51,11 +51,8 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> 
</span><del>-function SimpleCanvasBenchmark(suite, test, options, recordTable, progressBar) {
-    options[&quot;gain&quot;] = 6;
-    options[&quot;addLimit&quot;] = 100;
-    options[&quot;removeLimit&quot;] = 1000;
-    StageBenchmark.call(this, suite, test, options, recordTable, progressBar);
</del><ins>+function SimpleCanvasBenchmark(suite, test, options, progressBar) {
+    StageBenchmark.call(this, suite, test, options, progressBar);
</ins><span class="cx"> }
</span><span class="cx"> SimpleCanvasBenchmark.prototype = Object.create(StageBenchmark.prototype);
</span><span class="cx"> SimpleCanvasBenchmark.prototype.constructor = SimpleCanvasBenchmark;
</span></span></pre></div>
<a id="trunkPerformanceTestsAnimometertestssimplesimplecanvaspathshtml"></a>
<div class="modfile"><h4>Modified: trunk/PerformanceTests/Animometer/tests/simple/simple-canvas-paths.html (194406 => 194407)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/PerformanceTests/Animometer/tests/simple/simple-canvas-paths.html        2015-12-24 01:10:55 UTC (rev 194406)
+++ trunk/PerformanceTests/Animometer/tests/simple/simple-canvas-paths.html        2015-12-24 01:31:47 UTC (rev 194407)
</span><span class="lines">@@ -7,7 +7,6 @@
</span><span class="cx">     &lt;script src=&quot;../../resources/sampler.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;../../resources/extensions.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;../resources/math.js&quot;&gt;&lt;/script&gt;
</span><del>-    &lt;script src=&quot;../resources/utilities.js&quot;&gt;&lt;/script&gt;
</del><span class="cx">     &lt;script src=&quot;../resources/main.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;../resources/stage.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;resources/simple-canvas.js&quot;&gt;&lt;/script&gt;
</span></span></pre></div>
<a id="trunkPerformanceTestsAnimometerteststemplateresourcestemplatecanvasjs"></a>
<div class="modfile"><h4>Modified: trunk/PerformanceTests/Animometer/tests/template/resources/template-canvas.js (194406 => 194407)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/PerformanceTests/Animometer/tests/template/resources/template-canvas.js        2015-12-24 01:10:55 UTC (rev 194406)
+++ trunk/PerformanceTests/Animometer/tests/template/resources/template-canvas.js        2015-12-24 01:31:47 UTC (rev 194407)
</span><span class="lines">@@ -76,9 +76,9 @@
</span><span class="cx">     return StageAnimator.prototype.animate.call(this);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-function TemplateCanvasBenchmark(suite, test, options, recordTable, progressBar)
</del><ins>+function TemplateCanvasBenchmark(suite, test, options, progressBar)
</ins><span class="cx"> {
</span><del>-    StageBenchmark.call(this, suite, test, options, recordTable, progressBar);
</del><ins>+    StageBenchmark.call(this, suite, test, options, progressBar);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> TemplateCanvasBenchmark.prototype = Object.create(StageBenchmark.prototype);
</span><span class="lines">@@ -96,9 +96,9 @@
</span><span class="cx">     return new TemplateCanvasAnimator(this, this._options);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-window.benchmarkClient.create = function(suite, test, options, recordTable, progressBar)
</del><ins>+window.benchmarkClient.create = function(suite, test, options, progressBar)
</ins><span class="cx"> {
</span><span class="cx">     // This function is called from the test harness which starts the
</span><span class="cx">     // test by creating your benchmark object.
</span><del>-    return new TemplateCanvasBenchmark(suite, test, options, recordTable, progressBar);
</del><ins>+    return new TemplateCanvasBenchmark(suite, test, options, progressBar);
</ins><span class="cx"> }
</span></span></pre></div>
<a id="trunkPerformanceTestsAnimometerteststemplateresourcestemplatecssjs"></a>
<div class="modfile"><h4>Modified: trunk/PerformanceTests/Animometer/tests/template/resources/template-css.js (194406 => 194407)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/PerformanceTests/Animometer/tests/template/resources/template-css.js        2015-12-24 01:10:55 UTC (rev 194406)
+++ trunk/PerformanceTests/Animometer/tests/template/resources/template-css.js        2015-12-24 01:31:47 UTC (rev 194407)
</span><span class="lines">@@ -32,9 +32,9 @@
</span><span class="cx">     // Loop through all your objects and ask them to animate.
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-function TemplateCssBenchmark(suite, test, options, recordTable, progressBar)
</del><ins>+function TemplateCssBenchmark(suite, test, options, progressBar)
</ins><span class="cx"> {
</span><del>-    StageBenchmark.call(this, suite, test, options, recordTable, progressBar);
</del><ins>+    StageBenchmark.call(this, suite, test, options, progressBar);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> TemplateCssBenchmark.prototype = Object.create(StageBenchmark.prototype);
</span><span class="lines">@@ -47,9 +47,9 @@
</span><span class="cx">     return new TemplateCssStage(element, this._options);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-window.benchmarkClient.create = function(suite, test, options, recordTable, progressBar)
</del><ins>+window.benchmarkClient.create = function(suite, test, options, progressBar)
</ins><span class="cx"> {
</span><span class="cx">     // This function is called from the test harness which starts the
</span><span class="cx">     // test by creating your benchmark object.
</span><del>-    return new TemplateCssBenchmark(suite, test, options, recordTable, progressBar);
</del><ins>+    return new TemplateCssBenchmark(suite, test, options, progressBar);
</ins><span class="cx"> }
</span></span></pre></div>
<a id="trunkPerformanceTestsAnimometerteststemplateresourcestemplatesvgjs"></a>
<div class="modfile"><h4>Modified: trunk/PerformanceTests/Animometer/tests/template/resources/template-svg.js (194406 => 194407)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/PerformanceTests/Animometer/tests/template/resources/template-svg.js        2015-12-24 01:10:55 UTC (rev 194406)
+++ trunk/PerformanceTests/Animometer/tests/template/resources/template-svg.js        2015-12-24 01:31:47 UTC (rev 194407)
</span><span class="lines">@@ -32,9 +32,9 @@
</span><span class="cx">     // TODO: Loop through all your objects and ask them to animate.
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-function TemplateSvgBenchmark(suite, test, options, recordTable, progressBar)
</del><ins>+function TemplateSvgBenchmark(suite, test, options, progressBar)
</ins><span class="cx"> {
</span><del>-    StageBenchmark.call(this, suite, test, options, recordTable, progressBar);
</del><ins>+    StageBenchmark.call(this, suite, test, options, progressBar);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> TemplateSvgBenchmark.prototype = Object.create(StageBenchmark.prototype);
</span><span class="lines">@@ -47,9 +47,9 @@
</span><span class="cx">     return new TemplateSvgStage(element, this._options);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-window.benchmarkClient.create = function(suite, test, options, recordTable, progressBar)
</del><ins>+window.benchmarkClient.create = function(suite, test, options, progressBar)
</ins><span class="cx"> {
</span><span class="cx">     // This function is called from the test harness which starts the
</span><span class="cx">     // test by creating your benchmark object.
</span><del>-    return new TemplateSvgBenchmark(suite, test, options, recordTable, progressBar);
</del><ins>+    return new TemplateSvgBenchmark(suite, test, options, progressBar);
</ins><span class="cx"> }
</span></span></pre></div>
<a id="trunkPerformanceTestsAnimometerteststemplatetemplatecanvashtml"></a>
<div class="modfile"><h4>Modified: trunk/PerformanceTests/Animometer/tests/template/template-canvas.html (194406 => 194407)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/PerformanceTests/Animometer/tests/template/template-canvas.html        2015-12-24 01:10:55 UTC (rev 194406)
+++ trunk/PerformanceTests/Animometer/tests/template/template-canvas.html        2015-12-24 01:31:47 UTC (rev 194407)
</span><span class="lines">@@ -7,7 +7,6 @@
</span><span class="cx">     &lt;script src=&quot;../../resources/sampler.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;../../resources/extensions.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;../resources/math.js&quot;&gt;&lt;/script&gt;
</span><del>-    &lt;script src=&quot;../resources/utilities.js&quot;&gt;&lt;/script&gt;    
</del><span class="cx">     &lt;script src=&quot;../resources/main.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;../resources/stage.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;resources/template-canvas.js&quot;&gt;&lt;/script&gt;
</span></span></pre></div>
<a id="trunkPerformanceTestsAnimometerteststemplatetemplatecsshtml"></a>
<div class="modfile"><h4>Modified: trunk/PerformanceTests/Animometer/tests/template/template-css.html (194406 => 194407)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/PerformanceTests/Animometer/tests/template/template-css.html        2015-12-24 01:10:55 UTC (rev 194406)
+++ trunk/PerformanceTests/Animometer/tests/template/template-css.html        2015-12-24 01:31:47 UTC (rev 194407)
</span><span class="lines">@@ -7,7 +7,6 @@
</span><span class="cx">     &lt;script src=&quot;../../resources/sampler.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;../../resources/extensions.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;../resources/math.js&quot;&gt;&lt;/script&gt;
</span><del>-    &lt;script src=&quot;../resources/utilities.js&quot;&gt;&lt;/script&gt;    
</del><span class="cx">     &lt;script src=&quot;../resources/main.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;../resources/stage.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;resources/template-css.js&quot;&gt;&lt;/script&gt;
</span></span></pre></div>
<a id="trunkPerformanceTestsAnimometerteststemplatetemplatesvghtml"></a>
<div class="modfile"><h4>Modified: trunk/PerformanceTests/Animometer/tests/template/template-svg.html (194406 => 194407)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/PerformanceTests/Animometer/tests/template/template-svg.html        2015-12-24 01:10:55 UTC (rev 194406)
+++ trunk/PerformanceTests/Animometer/tests/template/template-svg.html        2015-12-24 01:31:47 UTC (rev 194407)
</span><span class="lines">@@ -7,7 +7,6 @@
</span><span class="cx">     &lt;script src=&quot;../../resources/sampler.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;../../resources/extensions.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;../resources/math.js&quot;&gt;&lt;/script&gt;
</span><del>-    &lt;script src=&quot;../resources/utilities.js&quot;&gt;&lt;/script&gt;    
</del><span class="cx">     &lt;script src=&quot;../resources/main.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;../resources/stage.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;resources/template-svg.js&quot;&gt;&lt;/script&gt;
</span></span></pre></div>
<a id="trunkPerformanceTestsAnimometerteststextlayeringtexthtml"></a>
<div class="modfile"><h4>Modified: trunk/PerformanceTests/Animometer/tests/text/layering-text.html (194406 => 194407)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/PerformanceTests/Animometer/tests/text/layering-text.html        2015-12-24 01:10:55 UTC (rev 194406)
+++ trunk/PerformanceTests/Animometer/tests/text/layering-text.html        2015-12-24 01:31:47 UTC (rev 194407)
</span><span class="lines">@@ -24,7 +24,6 @@
</span><span class="cx">     &lt;script src=&quot;../../resources/sampler.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;../../resources/extensions.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;../resources/math.js&quot;&gt;&lt;/script&gt;
</span><del>-    &lt;script src=&quot;../resources/utilities.js&quot;&gt;&lt;/script&gt;    
</del><span class="cx">     &lt;script src=&quot;../resources/main.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;../resources/stage.js&quot;&gt;&lt;/script&gt;  
</span><span class="cx">     &lt;script src=&quot;resources/layering-text.js&quot;&gt;&lt;/script&gt;
</span></span></pre></div>
<a id="trunkPerformanceTestsAnimometerteststextresourceslayeringtextjs"></a>
<div class="modfile"><h4>Modified: trunk/PerformanceTests/Animometer/tests/text/resources/layering-text.js (194406 => 194407)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/PerformanceTests/Animometer/tests/text/resources/layering-text.js        2015-12-24 01:10:55 UTC (rev 194406)
+++ trunk/PerformanceTests/Animometer/tests/text/resources/layering-text.js        2015-12-24 01:31:47 UTC (rev 194407)
</span><span class="lines">@@ -236,9 +236,9 @@
</span><span class="cx">     return this._textElements.length;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-function LayeringTextBenchmark(suite, test, options, recordTable, progressBar)
</del><ins>+function LayeringTextBenchmark(suite, test, options, progressBar)
</ins><span class="cx"> {
</span><del>-    StageBenchmark.call(this, suite, test, options, recordTable, progressBar);
</del><ins>+    StageBenchmark.call(this, suite, test, options, progressBar);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> LayeringTextBenchmark.prototype = Object.create(StageBenchmark.prototype);
</span><span class="lines">@@ -249,7 +249,7 @@
</span><span class="cx">     return new LayeringTextStage(element, this._options);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-window.benchmarkClient.create = function(suite, test, options, recordTable, progressBar)
</del><ins>+window.benchmarkClient.create = function(suite, test, options, progressBar)
</ins><span class="cx"> {
</span><del>-    return new LayeringTextBenchmark(suite, test, options, recordTable, progressBar);
</del><ins>+    return new LayeringTextBenchmark(suite, test, options, progressBar);
</ins><span class="cx"> }
</span></span></pre></div>
<a id="trunkPerformanceTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/PerformanceTests/ChangeLog (194406 => 194407)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/PerformanceTests/ChangeLog        2015-12-24 01:10:55 UTC (rev 194406)
+++ trunk/PerformanceTests/ChangeLog        2015-12-24 01:31:47 UTC (rev 194407)
</span><span class="lines">@@ -1,3 +1,265 @@
</span><ins>+2015-12-23  Jon Lee  &lt;jonlee@apple.com&gt;
+
+        Split benchmark into two different pages
+        https://bugs.webkit.org/show_bug.cgi?id=152458
+
+        Reviewed by Simon Fraser.
+
+        Address comments.
+
+        * Animometer/resources/debug-runner/benchmark-runner.js:
+        (BenchmarkRunner.prototype._runTestAndRecordResults): When the testing is complete the frame owning the
+        sampler goes away, and a later call to get the JSON data is no longer available. Process the data
+        right here, instead, and just reference it when displaying the results in ResultsDashboard.prototype._processData.
+        * Animometer/resources/extensions.js:
+        (Array.prototype.fill.Array.prototype.fill): Add a null check. Remove braces around single-line clause.
+        (Array.prototype.find.Array.prototype.find): Update the null check.
+        (ResultsDashboard.prototype._processData): Use the already-processed data.
+        * Animometer/resources/runner/animometer.css:
+        (.frame-container &gt; iframe): Remove calc().
+
+        Move Array functions to extensions.js since that is included by the harness.
+        Add ES6 Array polyfills.
+
+        * Animometer/resources/algorithm.js:
+        (Array.prototype.swap): Moved to extensions.js.
+        * Animometer/resources/extensions.js:
+        (Array.prototype.swap):
+        (Array.prototype.fill): Added.
+        (Array.prototype.find): Added.
+
+        Adjust styles for iPad.
+
+        * Animometer/resources/runner/animometer.css:
+        (@media screen and (min-device-width: 768px)): Apply to iPad as well.
+        (@media screen and (max-device-width: 1024px)): Update width for iPads.
+
+        Adjustment styles for iOS.
+
+        * Animometer/developer.html: Different divs contain the iframe, so use a class instead and
+        update the style rules.
+        * Animometer/index.html:
+        * Animometer/resources/debug-runner/animometer.css: Remove extraneous rules.
+        (@media screen and (min-device-width: 1800px)): Move this up.
+        * Animometer/resources/runner/animometer.css: Add rules to accomodate iOS.
+
+        Get rid of prefixed flex properties for now.
+
+        * Animometer/resources/debug-runner/animometer.css:
+        * Animometer/resources/runner/animometer.css:
+
+        Update the structure of the harness. Remove the JSON-per-test but keep
+        the JSON of the whole test run. Use the full page in order to display
+        the graph.
+
+        * Animometer/developer.html: Update several of the JS file includes to UTF-8. Remove header and footer. Test results screen includes score,
+        average, and worst 5% statistics.
+        * Animometer/index.html: Make structure similar to developer.html.
+        * Animometer/resources/debug-runner/animometer.css: Remove most of the
+        button rules since they are superfluous. Move the progress bar to the
+        top, fixed. Update the results page rules.
+        * Animometer/resources/debug-runner/animometer.js: Remove most of the
+        additions to sectionsManager since they are no longer needed.
+        (setSectionHeader): Updates header of the section.
+        (window.suitesManager._updateStartButtonState): Update selector.
+        (showResults): Add keypress event for selecting different data for
+        copy/paste. Update how the results are populated. Include full test
+        JSON in a textarea, rather than requiring a button press.
+        (showTestGraph):
+        * Animometer/resources/debug-runner/tests.js: Update structure of Headers. Define different kinds of headers. Headers can control their
+        title, and the text used as the cell contents, including class name.
+        * Animometer/resources/extensions.js:
+        (ResultsTable): Update to include a flattened version of the headers,
+        used while populating table contents. Remove unneeded helper functions
+        for creating the table. Rename &quot;show&quot; to &quot;add&quot;.
+        * Animometer/resources/runner/animometer.css: Update rules to
+        accommodate the new structure.
+        * Animometer/resources/runner/animometer.js:
+        (window.sectionsManager.setSectionScore): Helper function to set the
+        score and mean for a section.
+        (window.sectionsManager.populateTable): Helper function to set the table.
+        (window.benchmarkController.showResults): Refactor.
+        (window.benchmarkController.selectResults): Update selectors.
+        * Animometer/resources/runner/tests.js: Set Headers. Debug harness
+        extends it.
+
+        Update debug runner to have similar names to the basic runner. Include
+        that page's CSS and remove extraneous CSS rules.
+
+        Get rid of the statistics table #record.
+
+        * Animometer/developer.html: Rename #home to #intro. Rename .spacer to hr.
+        * Animometer/resources/debug-runner/animometer.css: Set to flexbox when selected.
+        * Animometer/resources/debug-runner/animometer.js: Remove recordTable.
+        (window.suitesManager._updateStartButtonState): Update selector to #intro.
+        (setupRunningSectionStyle): Deleted.
+
+        * Animometer/resources/runner/animometer.css:
+        (#test-container.selected): Change to flex-box only when visible.
+
+        Remove recordTable.
+        * Animometer/resources/debug-runner/benchmark-runner.js:
+        (BenchmarkRunner.prototype._runTestAndRecordResults):
+        * Animometer/resources/runner/tests.js:
+        * Animometer/tests/bouncing-particles/resources/bouncing-canvas-images.js:
+        * Animometer/tests/bouncing-particles/resources/bouncing-canvas-particles.js:
+        * Animometer/tests/bouncing-particles/resources/bouncing-canvas-shapes.js:
+        * Animometer/tests/bouncing-particles/resources/bouncing-css-images.js:
+        * Animometer/tests/bouncing-particles/resources/bouncing-css-shapes.js:
+        * Animometer/tests/bouncing-particles/resources/bouncing-particles.js:
+        * Animometer/tests/bouncing-particles/resources/bouncing-svg-images.js:
+        * Animometer/tests/bouncing-particles/resources/bouncing-svg-shapes.js:
+        * Animometer/tests/examples/resources/canvas-electrons.js:
+        * Animometer/tests/examples/resources/canvas-stars.js:
+        * Animometer/tests/misc/resources/compositing-transforms.js:
+        * Animometer/tests/resources/main.js:
+        * Animometer/tests/resources/stage.js:
+        (StageBenchmark): Remove _recordTable.
+        * Animometer/tests/simple/resources/simple-canvas-paths.js:
+        * Animometer/tests/simple/resources/simple-canvas.js:
+        * Animometer/tests/template/resources/template-canvas.js:
+        * Animometer/tests/template/resources/template-css.js:
+        * Animometer/tests/template/resources/template-svg.js:
+        * Animometer/tests/text/resources/layering-text.js:
+
+        * Animometer/resources/debug-runner/animometer.js:
+        (willStartFirstIteration): Fix selector, since results-table is used
+        in multiple places, so it cannot be an id.
+
+        Make it possible to select the scores, or the whole table data,
+        by cycling through different selections through key press of 's'.
+
+        * Animometer/resources/runner/animometer.js:
+        (window.benchmarkController.showResults): Attach a keypress handler
+        if it hasn't been added already.
+        (window.benchmarkController.selectResults):
+        * Animometer/resources/runner/tests.js: Cycle through different
+        ranges.
+
+        Fix a few fly-by errors.
+
+        * Animometer/resources/debug-runner/benchmark-runner.js:
+        (BenchmarkRunnerState.prototype.prepareCurrentTest): Update the frame relative path
+        since the files are now in the top directory instead of inside runner/.
+        (BenchmarkRunner.prototype._runTestAndRecordResults): Incorrect reference to function.
+        (BenchmarkRunner.prototype.step): Member variable is never used.
+
+        A little stylistic cleanup.
+
+        * Animometer/resources/debug-runner/benchmark-runner.js:
+        * Animometer/resources/extensions.js:
+        (window.DocumentExtension.createElement):
+        * Animometer/tests/resources/main.js:
+        (Benchmark.prototype.record):
+        * Animometer/tests/resources/stage.js:
+        (StageBenchmark.prototype.showResults): Reverse progress and message.
+        The message appears less frequently than the progress.
+        * Animometer/tests/simple/resources/simple-canvas.js:
+        (SimpleCanvasBenchmark): Remove unused options.
+
+        Add newer version of harness in a new page. Consolidate differences between the two
+        pages.
+
+        * Animometer/developer.html: Include runner/animometer.js. Rename the JS function
+        to run the benchmark to startBenchmark() instead of startTest(). Rename #running to
+        #test-container.
+        * Animometer/index.html: Added. Similarly calls startBenchmark() and has #test-container.
+        * Animometer/resources/debug-runner/animometer.css: Make the canvas 2:1 (1200px x 800px)
+        instead of 4:3.
+
+        Split out benchmarkRunnerClient and benchmarkController.
+
+        * Animometer/resources/debug-runner/animometer.js: Move needed functions out of
+        benchmarkRunnerClient, and leave the rest here to extend that object. Get rid of _resultsTable
+        and move populating the results table into benchmarkController. Rename _resultsDashboard
+        to results and make it accessible for other objects to use.
+        (willAddTestFrame): This is unnecessary. Remove.
+
+        (window.sectionsManager.showScore): Grab it from the results object instead of
+        benchmarkRunnerClient.
+        (window.sectionsManager.showSection): Deleted. Moved to runner/animometer.js.
+
+        (window.benchmarkController._runBenchmark): Deleted. Mostly moved into _startBenchmark.
+        (window.benchmarkController.startBenchmark): Refactor to call _startBenchmark.
+        (window.benchmarkController.showResults): Include most of benchmarkRunnerClient.didFinishLastIteration()
+        here.
+
+        * Animometer/resources/debug-runner/benchmark-runner.js:
+        (BenchmarkRunner.prototype._appendFrame): Remove unneeded call to willAddTestFrame.
+        * Animometer/resources/extensions.js:
+        (ResultsDashboard): Change the class to process the sampler data on-demand and hold onto that data
+        for later referencing.
+        (ResultsDashboard.prototype.toJSON): Deleted.
+        (ResultsDashboard.prototype._processData): Rename toJSON to _processData since it's not really
+        outputting JSON. Store the processed data into a member variable that can be referenced later.
+        (ResultsDashboard.prototype.get data): Process the data if it hasn't already.
+        (ResultsDashboard.prototype.get score): Process the data if it hasn't already, then return the
+        aggregate score.
+        (ResultsTable.prototype._showHeader): When outputting the results to a table, don't force the
+        need for an empty children array. This was to allow for a header row in the table that spanned
+        multiple columns. In the simpler harness, this is not needed.
+        (ResultsTable.prototype._showEmptyCells):
+        (ResultsTable.prototype._showTest): This hardcoded the columns. At least for the name and score,
+        which is the bare minimum needed for the simpler harness, key off of the header name provided.
+        * Animometer/resources/runner/animometer.css: Added. Use a similar 2:1 ratio. The score tables are
+        split into the data and the headers, and are also displayed RTL so that a later patch allows a
+        user to copy-paste the data easily.
+        * Animometer/resources/runner/animometer.js: Added. Use a simpler version of benchmarkRunnerClient.
+        The debug harness will extend these classes.
+        (window.benchmarkController._startBenchmark): Used by both harnesses.
+        (window.benchmarkController.startBenchmark): Set hard-coded options.
+        (window.benchmarkController.showResults): Includes most of benchmarkRunnerClient.didFinishLastIteration()
+        here.
+
+        Get rid of utilities.js. Move it all into extensions.js.
+
+        * Animometer/resources/extensions.js:
+        * Animometer/tests/resources/utilities.js: Removed.
+
+        * Animometer/tests/bouncing-particles/bouncing-canvas-images.html: Remove script link.
+        * Animometer/tests/bouncing-particles/bouncing-canvas-shapes.html: Ditto.
+        * Animometer/tests/bouncing-particles/bouncing-css-images.html: Ditto.
+        * Animometer/tests/bouncing-particles/bouncing-css-shapes.html: Ditto.
+        * Animometer/tests/bouncing-particles/bouncing-svg-images.html: Ditto.
+        * Animometer/tests/bouncing-particles/bouncing-svg-shapes.html: Ditto.
+        * Animometer/tests/examples/canvas-electrons.html: Ditto.
+        * Animometer/tests/examples/canvas-stars.html: Ditto.
+        * Animometer/tests/misc/compositing-transforms.html: Ditto.
+        * Animometer/tests/simple/simple-canvas-paths.html: Ditto.
+        * Animometer/tests/template/template-canvas.html: Ditto.
+        * Animometer/tests/template/template-css.html: Ditto.
+        * Animometer/tests/template/template-svg.html: Ditto.
+        * Animometer/tests/text/layering-text.html: Ditto.
+
+        Split tests.js into two. Add a new suite to runner/tests.js.
+
+        * Animometer/developer.html: Update the script order. Scripts from
+        debug-runner/ will always build on those from runner/, and have the
+        same name.
+        * Animometer/resources/debug-runner/tests.js: Move &quot;complex examples&quot;
+        suite into &quot;miscellaneous tests&quot;.
+        (Suite): Deleted.
+        (Suite.prototype.prepare): Deleted.
+        (Suite.prototype.run): Deleted.
+        (suiteFromName): Deleted.
+        * Animometer/resources/runner/tests.js: Added. Take definitions and
+        functions needed by the test harness. Leave the test suites behind.
+        (Suite): Moved from debug script.
+        (Suite.prototype.prepare): Ditto.
+        (Suite.prototype.run): Ditto.
+        (suiteFromName): Ditto.
+        (testFromName): Ditto.
+
+        Move benchmark resources out into resources/debug-runner, and update URLs.
+
+        * Animometer/developer.html: Renamed from PerformanceTests/Animometer/runner/animometer.html.
+        * Animometer/resources/debug-runner/animometer.css: Renamed from PerformanceTests/Animometer/runner/resources/animometer.css.
+        * Animometer/resources/debug-runner/animometer.js: Renamed from PerformanceTests/Animometer/runner/resources/animometer.js.
+        * Animometer/resources/debug-runner/benchmark-runner.js: Renamed from PerformanceTests/Animometer/runner/resources/benchmark-runner.js.
+        * Animometer/resources/debug-runner/d3.min.js: Renamed from PerformanceTests/Animometer/runner/resources/d3.min.js.
+        * Animometer/resources/debug-runner/graph.js: Renamed from PerformanceTests/Animometer/runner/resources/graph.js.
+        * Animometer/resources/debug-runner/tests.js: Renamed from PerformanceTests/Animometer/runner/resources/tests.js.
+
</ins><span class="cx"> 2015-12-11  Jon Lee  &lt;jonlee@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Improve Animometer on iOS
</span></span></pre>
</div>
</div>

</body>
</html>