pax_global_header00006660000000000000000000000064122512334010014503gustar00rootroot0000000000000052 comment=78f2aa7133bd59e6be0eb92e9cd60c7f14b50987 rickshaw-1.4.6/000077500000000000000000000000001225123340100133265ustar00rootroot00000000000000rickshaw-1.4.6/.gitignore000066400000000000000000000000301225123340100153070ustar00rootroot00000000000000*.log *swp node_modules rickshaw-1.4.6/.jshintignore000066400000000000000000000001451225123340100160320ustar00rootroot00000000000000node_modules/ **/vendor/ **/*[.-]min.js src/js/Rickshaw.Class.js src/js/Rickshaw.Compat.ClassList.js rickshaw-1.4.6/.jshintrc000066400000000000000000000003151225123340100151520ustar00rootroot00000000000000{ "funcscope": true, "lastsemic": true, "loopfunc": true, "eqnull": true, "expr": true, "undef": true, "browser": true, "node": true, "predef": ["Rickshaw", "d3", "$", "console", "io"] } rickshaw-1.4.6/.rock.yml000066400000000000000000000002051225123340100150620ustar00rootroot00000000000000runtime: node010 build: npm install && make clean && make run: rock --runtime=python27 run python -m SimpleHTTPServer test: npm test rickshaw-1.4.6/CONTRIBUTING.md000066400000000000000000000010601225123340100155540ustar00rootroot00000000000000## Pull requests are always welcome! Please follow a few guidelines: - Please don't include updated versions of `rickshaw.js` and `rickshaw.min.js`. Just changes to the source files will suffice. - Add a unit test or two to cover the proposed changes - Please run the tests and make sure tests are all passing before submitting your pull request - Do as the Romans do and stick with existing whitespace and formatting conventions (i.e., tabs instead of spaces, etc) - Consider adding a simple example under examples/ that demonstrates any new functionality rickshaw-1.4.6/LICENSE000066400000000000000000000020641225123340100143350ustar00rootroot00000000000000Copyright (C) 2011-2013 by Shutterstock Images, LLC Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. rickshaw-1.4.6/Makefile000066400000000000000000000045751225123340100150010ustar00rootroot00000000000000NODE_PREFIX=$(shell npm prefix) NODE_MODULES=$(NODE_PREFIX)/node_modules CSS_MIN=$(NODE_MODULES)/.bin/cleancss JS_MIN=$(NODE_MODULES)/.bin/uglifyjs JS_HINT=$(NODE_MODULES)/.bin/jshint D3=$(NODE_MODULES)/d3 JSDOM=$(NODE_MODULES)/jsdom NODEUNIT=$(NODE_MODULES)/nodeunit CSS_FILES=\ src/css/detail.css\ src/css/graph.css\ src/css/legend.css\ JS_FILES=\ src/js/Rickshaw.js\ src/js/Rickshaw.Class.js\ src/js/Rickshaw.Compat.ClassList.js\ src/js/Rickshaw.Graph.js\ src/js/Rickshaw.Fixtures.Color.js\ src/js/Rickshaw.Fixtures.RandomData.js\ src/js/Rickshaw.Fixtures.Time.js\ src/js/Rickshaw.Fixtures.Time.Local.js\ src/js/Rickshaw.Fixtures.Number.js\ src/js/Rickshaw.Color.Palette.js\ src/js/Rickshaw.Graph.Ajax.js\ src/js/Rickshaw.Graph.Annotate.js\ src/js/Rickshaw.Graph.Axis.Time.js\ src/js/Rickshaw.Graph.Axis.X.js\ src/js/Rickshaw.Graph.Axis.Y.js\ src/js/Rickshaw.Graph.Axis.Y.Scaled.js\ src/js/Rickshaw.Graph.Behavior.Series.Highlight.js\ src/js/Rickshaw.Graph.Behavior.Series.Order.js\ src/js/Rickshaw.Graph.Behavior.Series.Toggle.js\ src/js/Rickshaw.Graph.HoverDetail.js\ src/js/Rickshaw.Graph.JSONP.js\ src/js/Rickshaw.Graph.Legend.js\ src/js/Rickshaw.Graph.RangeSlider.js\ src/js/Rickshaw.Graph.RangeSlider.Preview.js\ src/js/Rickshaw.Graph.Renderer.js\ src/js/Rickshaw.Graph.Renderer.Line.js\ src/js/Rickshaw.Graph.Renderer.Stack.js\ src/js/Rickshaw.Graph.Renderer.Bar.js\ src/js/Rickshaw.Graph.Renderer.Area.js\ src/js/Rickshaw.Graph.Renderer.ScatterPlot.js\ src/js/Rickshaw.Graph.Renderer.Multi.js\ src/js/Rickshaw.Graph.Renderer.LinePlot.js\ src/js/Rickshaw.Graph.Smoother.js\ src/js/Rickshaw.Graph.Socketio.js\ src/js/Rickshaw.Series.js\ src/js/Rickshaw.Series.FixedDuration.js\ .PHONY: clean build build: rickshaw.min.css rickshaw.min.js clean: rm -rf rickshaw.css rickshaw.js rickshaw.min.* test: $(D3) $(JSDOM) $(NODEUNIT) npm test $(JS_HINT): npm install jshint $(CSS_MIN): npm install clean-css $(JS_MIN): npm install uglify-js $(D3): npm install d3 $(JSDOM): npm install jsdom $(NODEUNIT): npm install nodeunit rickshaw.css: $(CSS_FILES) cat $(CSS_FILES) > rickshaw.css rickshaw.js: $(JS_FILES) $(JS_HINT) $(JS_HINT) src/js cat $(JS_FILES) > rickshaw.js rickshaw.min.css: $(CSS_MIN) rickshaw.css $(CSS_MIN) rickshaw.css > rickshaw.min.css rickshaw.min.js: $(JS_MIN) rickshaw.js $(JS_MIN) --reserved-names "\$$super" rickshaw.js > rickshaw.min.js rickshaw-1.4.6/README.md000066400000000000000000000173141225123340100146130ustar00rootroot00000000000000# Rickshaw Rickshaw is a JavaScript toolkit for creating interactive time series graphs, developed at [Shutterstock](http://www.shutterstock.com) ## Getting Started Getting started with a simple graph is straightforward. Here's the gist: ```javascript var graph = new Rickshaw.Graph( { element: document.querySelector('#graph'), series: [ { color: 'steelblue', data: [ { x: 0, y: 23}, { x: 1, y: 15 }, { x: 2, y: 79 } ] }, { color: 'lightblue', data: [ { x: 0, y: 30}, { x: 1, y: 20 }, { x: 2, y: 64 } ] } ] } ); graph.render(); ``` See the [overview](http://code.shutterstock.com/rickshaw/), [tutorial](http://shutterstock.github.com/rickshaw/tutorial/introduction.html), and [examples](http://shutterstock.github.com/rickshaw/examples/) for more. ## Rickshaw.Graph A Rickshaw graph. Send an `element` reference, `series` data, and optionally other properties to the constructor before calling `render()` to point the graph. A listing of properties follows. Send these as arguments to the constructor, and optionally set them later on already-instantiated graphs with a call to `configure()` ##### element A reference to an HTML element that should hold the graph. ##### series Array of objects containing series data to plot. Each object should contain `data` at a minimum, a sorted array of objects each with x and y properties. Optionally send a `name` and `color` as well. Some renderers and extensions may also support additional keys. ##### renderer A string containing the name of the renderer to be used. Options include `area`, `stack`, `bar`, `line`, and `scatterplot`. Also see the `multi` meta renderer in order to support different renderers per series. ##### width Width of the graph in pixels. Falls back to the width of the `element`, or defaults to 400 if the element has no width. ##### height Height of the graph in pixels. Falls back to the height of the `element`, or defaults to 250 if the element has no height. ##### min Lower value on the Y-axis, or `auto` for the lowest value in the series. Defaults to 0. ##### max Highest value on the Y-axis. Defaults to the highest value in the series. ##### padding An object containing any of `top`, `right`, `bottom`, and `left` properties specifying a padding percentage around the extrema of the data in the graph. Defaults to 0.01 on top for 1% padding, and 0 on other sides. Padding on the bottom only applies when the `yMin` is either negative or `auto`. ##### interpolation Line smoothing / interpolation method (see [D3 docs](https://github.com/mbostock/d3/wiki/SVG-Shapes#wiki-line_interpolate)); notable options: * `linear`: straight lines between points * `step-after`: square steps from point to point * `cardinal`: smooth curves via cardinal splines (default) * `basis`: smooth curves via B-splines ### Methods Once you have instantiated a graph, call methods below to get pixels on the screen, change configuration, and set callbacks. ##### render() Draw or redraw the graph. ##### configure() Set properties on an instantiated graph. Specify any properties the constructor accepts, including `width` and `height` and `renderer`. Call `render()` to redraw the graph and reflect newly-configured properties. ##### onUpdate(f) Add a callback to run when the graph is rendered ## Extensions Once you have a basic graph, extensions let you add functionality. See the [overview](http://code.shutterstock.com/rickshaw/) and [examples](http://shutterstock.github.com/rickshaw/examples/) listing for more. * __Rickshaw.Graph.Legend__ - add a basic legend * __Rickshaw.Graph.HoverDetail__ - show details on hover * __Rickshaw.Graph.JSONP__ - get data via a JSONP request * __Rickshaw.Graph.Annotate__ - add x-axis annotations * __Rickshaw.Graph.RangeSlider__ - dynamically zoom on the x-axis with a slider * __Rickshaw.Graph.RangeSlider.Preview__ - pan and zoom via graphical preview of entire data set * __Rickshaw.Graph.Axis.Time__ - add an x-axis and grid lines with time labels * __Rickshaw.Graph.Axis.X__ - add an x-axis and grid lines with arbitrary labels * __Rickshaw.Graph.Axis.Y__ - add a y-axis and grid lines * __Rickshaw.Graph.Axis.Y.Scaled__ - add a y-axis with an alternate scale * __Rickshaw.Graph.Behavior.Series.Highlight__ - highlight series on legend hover * __Rickshaw.Graph.Behavior.Series.Order__ - reorder series in the stack with drag-and-drop * __Rickshaw.Graph.Behavior.Series.Toggle__ - toggle series on and off through the legend ## Rickshaw.Color.Palette Rickshaw comes with a few color schemes. Instantiate a palette and specify a scheme name, and then call color() on the palette to get each next color. ```javascript var palette = new Rickshaw.Color.Palette( { scheme: 'spectrum2001' } ); palette.color() // => first color in the palette palette.color() // => next color in the palette... ``` #### Color Schemes * classic9 * colorwheel * cool * munin * spectrum14 * spectrum2000 * spectrum2001 #### Interpolation For graphs with more series than palettes have colors, specify an `interpolatedStopCount` to the palette constructor. ## Rickshaw and Cross-Browser Support This library works in modern browsers and Internet Explorer 9+. Rickshaw relies on the HTMLElement#classList API, which isn't natively supported in Internet Explorer 9. Rickshaw adds support by including a shim which implements the classList API by extending the HTMLElement prototype. You can disable this behavior if you like, by setting `RICKSHAW_NO_COMPAT` to a true value before including the library. ## Dependencies & Building Rickshaw relies on the fantastic [D3 visualization library](http://mbostock.github.com/d3/) to do lots of the heavy lifting for stacking and rendering to SVG. Some extensions require [jQuery](http://jquery.com) and [jQuery UI](http://jqueryui.com), but for drawing some basic graphs you'll be okay without. For building, we need [Node](http://nodejs.org) and [npm](http://npmjs.org). Running `make` should get you going with any luck. After doing a build you can run the tests with the command: `npm test` ## Contributing Pull requests are always welcome! Please follow a few guidelines: - Please don't include updated versions of `rickshaw.js` and `rickshaw.min.js`. Just changes to the source files will suffice. - Add a unit test or two to cover the proposed changes - Do as the Romans do and stick with existing whitespace and formatting conventions (i.e., tabs instead of spaces, etc) - Consider adding a simple example under `examples/` that demonstrates any new functionality ## Authors This library was developed by David Chester, Douglas Hunter, and Silas Sewell at [Shutterstock](http://www.shutterstock.com) ## License Copyright (C) 2011-2013 by Shutterstock Images, LLC Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. rickshaw-1.4.6/examples/000077500000000000000000000000001225123340100151445ustar00rootroot00000000000000rickshaw-1.4.6/examples/ajax.html000066400000000000000000000014521225123340100167570ustar00rootroot00000000000000
rickshaw-1.4.6/examples/bars.html000066400000000000000000000017201225123340100167610ustar00rootroot00000000000000
rickshaw-1.4.6/examples/colors.html000066400000000000000000000026421225123340100173370ustar00rootroot00000000000000 rickshaw-1.4.6/examples/css/000077500000000000000000000000001225123340100157345ustar00rootroot00000000000000rickshaw-1.4.6/examples/css/extensions.css000066400000000000000000000063011225123340100206450ustar00rootroot00000000000000div, span, p, td { font-family: Arial, sans-serif; } #content { width: 1200px; } #chart { display: inline-block; } #chart path { -webkit-transition: opacity 0.2s linear; } #preview { margin-top: 10px; } #legend { display: inline-block; position: relative; left: 8px; } #legend_container { position: absolute; right: 0; bottom: 26px; width: 0; } #chart_container { position: relative; display: inline-block; } #smoother { margin: 0 0 10px 16px; width: 100px; } .rickshaw_graph .detail { left: -1000; } #chart { border: 1px solid #f0f0f0; } #side_panel { padding: 0 20px 20px 0; width: 240px; display: inline-block; vertical-align: top; } #side_panel section { color: #505050; font-size: 12px; } #side_panel section h6 { margin: 0 0 1em 0; font-size: 12px; font-weight: normal; } #side_panel .ui-slider-horizontal { height: 1px !important; border-color: #e0e0e0; margin-bottom: 10px; } #side_panel .ui-slider-handle { border-color: #a0a0a0; height: 9px !important; width: 9px !important; top: -5px !important; border-radius: 6px; outline: none; cursor: pointer; } #legend { background-color: white; margin-left: 0; padding: 0; left: 0; } #legend .label { color: #404040; } #legend .action { color: black; opacity: 0.5; } #legend ul { padding: 0; } h1 { font-family: Franklin Gothic Medium, UnDotum, Helvetica, Arial; font-weight: normal; font-size: 20px; } section { border: none; border-top: 1px solid #eaeaea; padding: 15px 0; } #smoother { margin: 5px 0 0 10px; width: 90%; } label.disabled { opacity: 0.4; } #renderer_form.toggler { display: block; margin: 0; } #renderer_form.toggler input[type=radio]:checked { outline: 2px solid steelblue; } #renderer_form.toggler input[type=radio] { -moz-appearance: button; background: white; margin: 0 7px; width: 39px; height: 26px; position: absolute; } #renderer_form.toggler label { display: inline-block; padding: 0; width: 39px; padding-top: 27px; text-align: center; font-size: 10px; color: #808080; background-repeat: no-repeat; position: relative; margin: 0 7px; cursor: pointer; } #interpolation_form, #offset_form { vertical-align: top; display: inline-block; width: 45%; } #interpolation_form label, #offset_form label { display: block; } label[for=area] { background: url(../images/om_stack.png); } label[for=line] { background: url(../images/om_lines.png); } label[for=bar] { background: url(../images/om_bar.png); } label[for=scatter] { background: url(../images/om_scatter.png); } #offset_form label, #interpolation_form label { background-repeat: no-repeat; background-position: 2em center; cursor: pointer; cursor: hand; } #offset_form label span, #interpolation_form label span { padding-left: 36px; } label[for=stack] { background-image: url(../images/offset_stack.png); } label[for=pct] { background-image: url(../images/offset_pct.png); } label[for=stream] { background-image: url(../images/offset_stream.png); } label[for=value] { background-image: url(../images/offset_value.png); } label[for=cardinal] { background-image: url(../images/interp_cardinal.png); } label[for=linear] { background-image: url(../images/interp_linear.png); } label[for=step] { background-image: url(../images/interp_step.png); } rickshaw-1.4.6/examples/css/lines.css000066400000000000000000000004461225123340100175640ustar00rootroot00000000000000div, span, p, td { font-family: Arial, sans-serif; } #chart { display: inline-block; } #legend { display: inline-block; position: relative; left: 8px; } #legend_container { position: absolute; right: 0; bottom: 26px; width: 0; } #chart_container { float: left; position: relative; } rickshaw-1.4.6/examples/data/000077500000000000000000000000001225123340100160555ustar00rootroot00000000000000rickshaw-1.4.6/examples/data/data.json000066400000000000000000000007101225123340100176570ustar00rootroot00000000000000[ { "color": "blue", "name": "New York", "data": [ { "x": 0, "y": 40 }, { "x": 1, "y": 49 }, { "x": 2, "y": 38 }, { "x": 3, "y": 30 }, { "x": 4, "y": 32 } ] }, { "name": "London", "data": [ { "x": 0, "y": 19 }, { "x": 1, "y": 22 }, { "x": 2, "y": 29 }, { "x": 3, "y": 20 }, { "x": 4, "y": 14 } ] }, { "name": "Tokyo", "data": [ { "x": 0, "y": 8 }, { "x": 1, "y": 12 }, { "x": 2, "y": 15 }, { "x": 3, "y": 11 }, { "x": 4, "y": 10 } ] } ] rickshaw-1.4.6/examples/data/data.jsonp000066400000000000000000000006321225123340100200420ustar00rootroot00000000000000callback([ { 'color': 'blue', 'name': 'London', 'data': [ { x: 0, y: 40 }, { x: 1, y: 49 }, { x: 2, y: 38 }, { x: 3, y: 30 }, { x: 4, y: 32 } ], }, { 'name': 'New York', 'data': [ { x: 0, y: 19 }, { x: 1, y: 22 }, { x: 2, y: 29 }, { x: 3, y: 20 }, { x: 4, y: 14 } ], }, { 'name': 'Tokyo', 'data': [ { x: 0, y: 8 }, { x: 1, y: 12 }, { x: 2, y: 15 }, { x: 3, y: 11 }, { x: 4, y: 10 } ], } ]); rickshaw-1.4.6/examples/data/data2.json000066400000000000000000000007101225123340100177410ustar00rootroot00000000000000[ { "color": "blue", "name": "New York", "data": [ { "x": 0, "y": 50 }, { "x": 1, "y": 32 }, { "x": 2, "y": 38 }, { "x": 3, "y": 30 }, { "x": 4, "y": 32 } ] }, { "name": "London", "data": [ { "x": 0, "y": 19 }, { "x": 1, "y": 76 }, { "x": 2, "y": 28 }, { "x": 3, "y": 20 }, { "x": 4, "y": 14 } ] }, { "name": "Tokyo", "data": [ { "x": 0, "y": 8 }, { "x": 1, "y": 12 }, { "x": 2, "y": 14 }, { "x": 3, "y": 11 }, { "x": 4, "y": 28 } ] } ] rickshaw-1.4.6/examples/data/status.json000066400000000000000000000141071225123340100202760ustar00rootroot00000000000000{"1320630300":{"304":41,"206":0,"502":0,"400":2,"408":49,"401":32,"200":1275,"302":13,"500":1,"301":7,"404":1},"1320629640":{"304":42,"206":0,"502":0,"400":2,"408":42,"401":29,"200":1245,"302":10,"500":0,"301":5,"404":0},"1320627540":{"304":55,"502":0,"400":2,"401":22,"408":43,"200":1178,"302":9,"301":8,"404":5},"1320630180":{"403":0,"304":39,"206":0,"502":0,"400":2,"408":39,"401":31,"200":1340,"302":14,"500":1,"404":1,"301":5},"1320628200":{"304":37,"206":0,"502":0,"400":2,"408":47,"401":30,"200":1232,"302":27,"301":8,"404":1},"1320629220":{"304":46,"206":0,"502":0,"400":2,"408":42,"401":29,"200":1212,"302":8,"301":8,"404":0},"1320627360":{"304":30,"206":0,"502":0,"400":1,"408":43,"401":27,"200":1190,"302":10,"500":0,"301":9,"404":1},"1320630120":{"304":44,"206":0,"502":0,"400":2,"408":48,"401":31,"200":1314,"302":11,"500":1,"301":7,"404":0},"1320629280":{"304":28,"206":0,"502":0,"400":2,"401":29,"408":43,"200":1236,"302":9,"500":0,"301":11},"1320628380":{"304":56,"206":0,"502":0,"400":4,"408":44,"401":23,"200":1305,"201":0,"302":16,"301":6,"404":1},"1320630480":{"304":60,"206":0,"502":0,"400":3,"408":51,"401":29,"200":1267,"302":12,"500":0,"301":8,"404":1},"1320628920":{"304":38,"206":0,"502":0,"400":2,"408":35,"401":21,"200":1211,"201":0,"302":9,"301":7,"404":1},"1320628320":{"304":46,"206":0,"502":0,"400":4,"408":43,"401":21,"200":1197,"302":13,"500":0,"301":5,"404":1},"1320629460":{"304":40,"502":1,"400":2,"401":27,"408":46,"200":1179,"302":39,"301":10,"404":1},"1320628500":{"304":40,"206":0,"502":0,"400":5,"408":42,"401":31,"200":1316,"302":10,"301":7,"404":1},"1320627300":{"304":34,"206":0,"502":0,"400":1,"408":48,"401":24,"200":1264,"302":9,"301":7,"404":1},"1320627960":{"403":0,"304":59,"206":0,"502":0,"400":2,"408":38,"401":27,"200":1180,"201":0,"302":7,"409":0,"500":0,"404":0,"301":8},"1320630600":{"304":40,"206":0,"502":0,"400":3,"408":46,"401":28,"200":1297,"302":12,"500":1,"301":7,"404":2},"1320628560":{"304":34,"206":0,"502":0,"400":3,"408":41,"401":31,"200":1275,"302":8,"301":9,"404":1},"1320628080":{"304":31,"206":0,"502":0,"400":2,"408":41,"401":27,"200":1177,"201":0,"302":5,"405":0,"301":7,"404":1},"1320627780":{"304":59,"502":0,"400":3,"401":27,"408":39,"200":1246,"302":14,"301":9,"404":1},"1320629940":{"304":42,"502":0,"400":2,"401":34,"408":44,"200":1297,"302":12,"500":0,"301":4,"404":1},"1320628020":{"304":38,"502":0,"400":3,"408":43,"401":27,"200":1200,"302":6,"405":0,"301":9,"404":0},"1320630360":{"304":44,"206":1,"502":0,"400":1,"408":47,"401":25,"200":1270,"302":11,"500":0,"301":7,"404":1},"1320629760":{"304":40,"206":0,"502":0,"400":2,"408":43,"401":29,"200":1302,"302":9,"500":0,"301":5,"404":1},"1320627720":{"304":36,"502":0,"400":3,"401":24,"408":43,"200":1166,"302":7,"301":9,"404":1},"1320627420":{"304":35,"206":0,"502":0,"400":2,"408":41,"401":28,"200":1220,"302":14,"301":10,"404":1},"1320629340":{"304":41,"206":0,"502":0,"400":3,"408":42,"401":33,"200":1255,"302":39,"301":10,"404":1},"1320628860":{"304":27,"206":0,"502":0,"400":2,"408":39,"401":20,"200":1167,"302":6,"301":7,"404":1},"1320629160":{"403":0,"304":43,"502":0,"400":2,"408":43,"401":23,"200":1214,"302":9,"410":0,"301":7,"404":1},"1320630420":{"304":39,"206":0,"502":0,"400":2,"408":46,"401":31,"200":1318,"302":10,"500":1,"301":9,"404":1},"1320627120":{"304":30,"206":0,"502":0,"400":3,"408":42,"401":29,"200":1166,"302":7,"301":6,"404":0},"1320630000":{"304":35,"502":0,"400":2,"401":29,"408":49,"200":1244,"302":8,"500":0,"301":3,"404":1},"1320629880":{"304":41,"502":0,"400":2,"401":30,"408":45,"200":1282,"302":9,"500":0,"301":5,"404":1},"1320628260":{"304":34,"204":0,"502":0,"400":5,"408":44,"401":28,"200":1205,"201":0,"302":8,"500":0,"301":10,"404":1},"1320629400":{"304":42,"206":0,"502":0,"400":2,"408":43,"401":30,"200":1242,"302":43,"301":10,"404":1},"1320627600":{"304":53,"206":0,"502":0,"400":2,"408":39,"401":26,"200":1190,"302":13,"500":0,"301":8,"404":3},"1320627660":{"304":42,"206":0,"502":1,"400":2,"408":42,"401":25,"200":1199,"201":0,"302":14,"301":7,"404":2},"1320629100":{"304":26,"502":0,"400":2,"401":23,"408":45,"200":1213,"302":9,"500":0,"301":7,"404":2},"1320627900":{"304":48,"502":0,"400":2,"401":26,"408":45,"200":1219,"302":7,"301":9,"404":1},"1320629580":{"304":22,"206":0,"502":0,"400":2,"408":37,"401":27,"200":1184,"302":13,"500":0,"301":8,"404":1},"1320628440":{"304":46,"206":0,"502":0,"400":4,"408":45,"401":27,"200":1320,"201":0,"302":11,"500":0,"301":6,"404":0},"1320628680":{"304":60,"502":0,"400":4,"408":45,"401":29,"200":1269,"201":0,"302":10,"301":9,"404":1},"1320630060":{"304":47,"502":0,"400":2,"401":28,"408":49,"200":1249,"302":8,"500":0,"301":6,"404":1},"1320627840":{"304":55,"502":0,"400":1,"401":23,"408":39,"200":1186,"302":7,"301":9,"404":1},"1320627180":{"304":24,"206":0,"502":0,"400":2,"408":38,"401":26,"200":1163,"302":7,"301":5,"404":1},"1320628740":{"304":50,"206":0,"502":0,"400":4,"408":40,"401":28,"200":1235,"302":10,"500":0,"301":8,"404":1},"1320630540":{"304":47,"206":0,"502":0,"400":4,"408":42,"401":28,"200":1371,"302":12,"500":0,"301":6,"404":1},"1320629040":{"304":29,"206":0,"502":1,"400":3,"408":42,"401":25,"200":1169,"302":7,"500":0,"410":0,"301":7,"404":1},"1320630240":{"403":0,"304":27,"206":0,"502":0,"400":1,"408":51,"401":30,"200":1297,"302":9,"500":0,"404":1,"301":7},"1320627480":{"304":34,"206":0,"502":0,"400":2,"408":40,"401":26,"200":1183,"302":13,"301":10,"404":2},"1320628620":{"304":37,"502":0,"400":5,"401":31,"408":45,"200":1215,"302":9,"301":10,"404":1},"1320628140":{"304":49,"206":0,"502":0,"400":2,"408":40,"401":33,"200":1238,"302":16,"301":8,"404":1},"1320629520":{"304":31,"502":0,"400":2,"401":29,"408":38,"200":1233,"302":32,"301":10,"404":0},"1320627240":{"304":40,"206":0,"502":0,"400":1,"401":23,"408":42,"200":1186,"302":8,"301":6},"1320629700":{"304":45,"206":0,"502":0,"400":1,"408":47,"401":26,"200":1206,"302":7,"500":0,"301":6,"404":1},"1320628980":{"304":38,"502":0,"400":2,"408":42,"401":27,"200":1234,"302":11,"405":0,"301":7,"404":0},"1320628800":{"304":32,"206":0,"502":0,"400":2,"408":50,"401":22,"200":1121,"302":9,"500":0,"301":7,"404":1},"1320629820":{"304":41,"206":0,"502":0,"400":2,"408":40,"401":23,"200":1280,"302":8,"301":5,"404":1}}rickshaw-1.4.6/examples/extensions.html000066400000000000000000000170141225123340100202340ustar00rootroot00000000000000

Random Data in the Future

Smoothing
rickshaw-1.4.6/examples/fixed.html000066400000000000000000000022021225123340100171250ustar00rootroot00000000000000
rickshaw-1.4.6/examples/formatter.html000066400000000000000000000042141225123340100200360ustar00rootroot00000000000000
rickshaw-1.4.6/examples/gaps.html000066400000000000000000000023661225123340100167730ustar00rootroot00000000000000
rickshaw-1.4.6/examples/hover.html000066400000000000000000000050171225123340100171600ustar00rootroot00000000000000

rickshaw-1.4.6/examples/images/000077500000000000000000000000001225123340100164115ustar00rootroot00000000000000rickshaw-1.4.6/examples/images/interp_cardinal.png000066400000000000000000000010721225123340100222550ustar00rootroot00000000000000PNG  IHDR rޗsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDAT8Ŕͫ1a89 !e&Q_?RRL VfJƷ9Wyszww=۶mPw@ xUc]in7TU%Ng<ͨjD"DQ0 3rx<vZv)J\W:Ʉ|>OXQ6 br( :9x^:e P@ H"zx<$I,G}8h4cDQD$Lt:H$( f~ORAŧ<%zB.#t:m0l[TU%J!2|NV#͒L&B_.ZnY4 A X'h4i8?jez=)l6{?~4Mv>Yvl[2 x~m~DDIENDB`rickshaw-1.4.6/examples/images/interp_linear.png000066400000000000000000000010731225123340100217530ustar00rootroot00000000000000PNG  IHDR rޗsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDAT81Qk|jL 5#͔)+J"IlF4QFɼ;},z>u~s 4M²Z Y#~):t]Ir8`0h40,b!fa]1D@GjBRa`Y( dYn( 8N( T aHP( ^l6(8E`%ihZe@D6 p<1 \.xfx?C^id2\oOrb p|VUnvOUIENDB`rickshaw-1.4.6/examples/images/interp_step.png000066400000000000000000000005761225123340100214630ustar00rootroot00000000000000PNG  IHDR rޗsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDAT8Ŕ=E@PjƎžTiPIDB"$[{S)&1_@@ܶ-q8I:b>EJe&MSh]mIiiW eY^>.R51L&Fr}}m$a<>dY@\^l6 (,3W(Jf3Rz=0d6oSvjyNQ.ۣX,tHӔU-B˲eYqJ); vLSlۦa6zx`0`iiE|ߧ頵&?K8n988`aa]jQ$ 777\\\I3q$xyȜ=ߍO|߯M9.IENDB`rickshaw-1.4.6/examples/images/offset_stream.png000066400000000000000000000015571225123340100217700ustar00rootroot00000000000000PNG  IHDR rޗsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDAT8]OZm)(%P>4 \b7&I(" ϶$b9s2ygw 8CRrd4! HB|˟fr}}mDQ*r' p.DYN,N&!H:t:6tZaxG`Z!e(ʷ7zzhDZ%JX, C)lF8&J1}JBP@$.WWW!le $X,sa( vKL&|X,$I!4 :n'z||ynMr!p]!Sl/Nضm;ɲLlo}p8LXd^ `})( Q.rZ4͝vj;0QzaXN3+!hD"A&!ɠialzZ-z$IB48Tv#Af9::"."IX,L&L&\e2 2t$˲Zl6jBUUNVy!X.;E"dY&0Ͽp(S*fb+9ib&(ȲضMףnP(DXR2zM˲>IP/6у-JIENDB`rickshaw-1.4.6/examples/images/offset_value.png000066400000000000000000000013031225123340100215760ustar00rootroot00000000000000PNG  IHDR rޗsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<@IDAT8œK*a$E2%-ZEE EP4t(-&1"k79>Wc|F+LL&baww-l6\a}\.קo _qyyI6|>(^w4 JVEQXZZ9Ns$&aPTxxx^/`Ifj?q!J} EߏnX,p:S]שj̛mvT*E\)p8a<H$0 I,Ce*ϓH$2uWΨVSUv\.G:f84 9<<4MTUe4aZٙd2iIANB0(I8::"PuE8 Snoolloo#2fD"_?q||"R Y@w#x4 BpssC2%DQY^^fmm jUU L+F??vsrr,8qUU6OpppdvgIENDB`rickshaw-1.4.6/examples/images/om_bar.png000066400000000000000000000006421225123340100203600ustar00rootroot00000000000000PNG  IHDR'7sBIT|d pHYsXX%tEXtSoftwarewww.inkscape.org<IDATH=0Ϩ`a;E `m9ػYTnUغ; EDaeAм@y+/"0$E;𪪐0s]?Y 3BȢr^H-a037W{?^/n*v0 ~i}R*b}ߣm[av^wfQ.sq,̂ ]kZNi z5m (4M\hYnۿK"uZNrk9ra$I_m0@AYeqP5q2]a6RJ|>|LQx TnIIENDB`rickshaw-1.4.6/examples/images/om_curves.png000066400000000000000000000007061225123340100211240ustar00rootroot00000000000000PNG  IHDR'7sBIT|d pHYsXX%tEXtSoftwarewww.inkscape.org<CIDATH햽1Fe-e,}IA,ן &"*,QtnW  ""‹lx\ei|^-SFk1c ~jA;vbh4b^Zv @z\ +"1>,롔t]~)Qq^t3}89f Cv/ )j䬵cTU*@!MS:AVlHr!s|2X,mdBcPjD"A.tU .ɰ^ YTD"TU\..\7'HW$Ih4 b045H$BGGCCC47u؉pBh4^tZJ6%N*vtfuV7ow,ḓ[NreeR4޽{G&A$z{{6Qw`M$IÐkkkiv;(A*B<P(rhkk;n X,Ftܻw/%JZ )6 Q״t:iiiiAww/`];;;A0R`llv( 8\]]i>$nllp 2GeY wܡbH0$ Ç$\.r9n߾ oߘajj%$Ibttd2I(h4"2,c B t:IRı wavv)8x^dYh4eӄazzzDeky>~&LP5Jx$}}}(J֛Ll> j<ގ=~Gz:? ~i"VY|>|6JӧO;|>bիW.:;;ae C=xV'pU TRIENDB`rickshaw-1.4.6/examples/images/om_percent.png000066400000000000000000000020611225123340100212510ustar00rootroot00000000000000PNG  IHDR'4GEFsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDATH͕KrM;mG @D]H]t@o*. S(`f'+C]|(^0{f5^k᡺IQ}o:::S6ɲ!IU }ߦ_鹊 O(t:e7UEzzzp:ՑfF?9Ap88Nd2a"?jbxxH:& D( [êjdddH&! rzzZ*J9FCee廦멪D:.A=??Jcc#V58F__$!I+TUT*E ^b`٨ @"J$ ˑPd2I</E!ˑKsDUUKFcK Y^^ֆYM$ʂv\.,sssC0$LgKT ~?{{{shNNNԖA`qqp8ʘ`raQ=fhPUSMef3B!rܻp݈388d2PU~FGG$+Blvv;lMDQDQQQN+XZZ"N?d2 dBaZyzzbkkh4J}}=CCCzYXXra~op80VK,#S(ꢭmfgg9??/kB 311>GGGߣ빼-SSSvpHiƘjC<g``Y*B:qEaeel^} JL&auu|>ŏ@ h4(VnwyQ/rOʭ;b1%Ɓ:ׁS75hЁqd1&$hD,76n]#ٛսYm%!  oJ [B!iZx6O"@uYXXtVnnnd2T*<9^^^ Q飯jm 4E-V%lpp{^{Tnm.a#:6Ow{L=\M QWVޜޖigggFbv(?bwww:rG[vz{{) FՅԥi8Ry刺B(T*4pI| b,LNNjml!`YR)rs$Ho9::SY\\4uhnnr岈7LL{^LBH$LɉC`+QPs_&&&&aNYMŭ5^{<K3,CQFbJT*(B4K(122bK[[[j5Ck4DŽ(JKl6K0~<gߴ|M[څ$IT*/p8B-s}}},TUeoo|>cuu4PL&$Ib1lqXFC24 FGGذEMӐevh5fPU!ħ+4؁Y933cgggae^'Lr~~N8&|eХ?WMIENDB`rickshaw-1.4.6/examples/images/om_stack.png000066400000000000000000000023071225123340100207210ustar00rootroot00000000000000PNG  IHDR'4GEFsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<DIDATH͗[O[3@ V9hjp![5?xWH0QJC!chB(J)PfiCZd2k&[yf̚% !7T%(s7 0 fff@.2iD$Lr}$I*.ϟ?;$`X"͜X,F `ss VT ˘YOIW{9??Çtvv>8!appp@,#IWTTB[[loo#opB2 GGGb1#HyY\{mZ[[innFUU0HA}}=a$Inݺu@* lllH$PU`m{Y۹w;;;}_2( !vxR4癛˳n笳DQbUUU=Alܽ{Պfjm6eeeXVʨ@4>| '''yW[[KCCiHaAhF$n7lmmAIDss3>\5M쌳34M]뺎i' t:illT*E(" H$x%4M}F `gg'ϖ N'?~dzzC2LA[/Ke\.>mP|iFGG x^|>H>*i6S!1Q*bKd2ׯE$IrX@T%jIENDB`rickshaw-1.4.6/examples/images/om_step.png000066400000000000000000000004521225123340100205660ustar00rootroot00000000000000PNG  IHDR'7sRGBbKGD pHYsXX%tIME #uIDATH= _ p KĂ[P^-YeOAcfsORj 0p 7]u]}׌!k59PJ?e5RƄ1bYeVfׯ_+6,l6˗/_8::/NA>'N׷ 188xq8!bM P`0@?][THRѷL&y&,#]h6R))bddUUetts voot:M>G$IN2D4lll0<<.\58D] 0 jZndY*nrX$2330eNY^^<j ׋yv >}eYqnݺ(J%4Mc``C*r* nSSS$ \BϾ߳gpM(" i@[YYYR0== NT*irD"΍7gvvY9::VQ.q8LNNv)x\./m8rJZFZV!IPCTbjjd2%iZgFZ$:h$IDPz)RPi266F0jQVt:q,bqq>npӳ( fy.'O#I066F$! y%?~E,JҙN]׉bLLL\m|>>e8B*\_v;w\ A.^dNd6[[[dY"ԥa~얘IENDB`rickshaw-1.4.6/examples/inconsistent.html000066400000000000000000000023111225123340100205470ustar00rootroot00000000000000
rickshaw-1.4.6/examples/index.html000066400000000000000000000123461225123340100171470ustar00rootroot00000000000000

Rickshaw Examples

Getting Started

Bare minimum to get a graph on the page with a couple of points.

Lines & Toggling

Basic lines with a legend and x-axis ticks and labels. Toggle lines on and off by clicking checkmarks.

Interactive Real-Time Data

Dig into continously updating data. Change line interpolations, zoom in on the x-axis, apply smoothing, stack and un-stack, drag and drop to re-order the stack, toggle data on and off.

Scatter Plot with Multiple Series

Basic scatter plot with two overlapping series.

Stacked Bars with Deterministic Colors

Requests per second by HTTP status as stacked bars. Colors come from a deterministic palette that can carry across graphs.

Color Schemes

A number of color schemes are built in. You can specify your own too.

Interpolated Colors

Interpolate color schemes for graphs with many series.

Data via AJAX / JSONP

Ask Rickshaw to fetch data via AJAX, rather than specifying in the constructor. There's a JSONP impelementation too.

Y-Axis Tick Marks and Grid Lines

Draw y-axis tick marks and grid lines with abbreviated numbers.

Custom Values on the X-Axis

Add custom values and custom formatting along the x-axis.

Fixed Window Series for Streaming Data

Fixed-size time window, useful for real-time graphs with socket.io.

Hover Details Custom Formatting

Send a custom formatter callback for finer control in hover details.

Subclassed Hover Behavior + Bottom Legend

Subclass hovers to provide an alternate legend at the bottom of the graph.

Scaled Series

Two series normalized with different scales, with two different scaled Y-axis.

Log and Absolute Scale

One series drawn using log and absolute scale on one graph.

Multiple Renderers

Bars, lines, area, and scatterplot graphs all in one setting.


rickshaw-1.4.6/examples/js/000077500000000000000000000000001225123340100155605ustar00rootroot00000000000000rickshaw-1.4.6/examples/js/extensions.js000066400000000000000000000055011225123340100203160ustar00rootroot00000000000000var RenderControls = function(args) { this.initialize = function() { this.element = args.element; this.graph = args.graph; this.settings = this.serialize(); this.inputs = { renderer: this.element.elements.renderer, interpolation: this.element.elements.interpolation, offset: this.element.elements.offset }; this.element.addEventListener('change', function(e) { this.settings = this.serialize(); if (e.target.name == 'renderer') { this.setDefaultOffset(e.target.value); } this.syncOptions(); this.settings = this.serialize(); var config = { renderer: this.settings.renderer, interpolation: this.settings.interpolation }; if (this.settings.offset == 'value') { config.unstack = true; config.offset = 'zero'; } else if (this.settings.offset == 'expand') { config.unstack = false; config.offset = this.settings.offset; } else { config.unstack = false; config.offset = this.settings.offset; } this.graph.configure(config); this.graph.render(); }.bind(this), false); } this.serialize = function() { var values = {}; var pairs = $(this.element).serializeArray(); pairs.forEach( function(pair) { values[pair.name] = pair.value; } ); return values; }; this.syncOptions = function() { var options = this.rendererOptions[this.settings.renderer]; Array.prototype.forEach.call(this.inputs.interpolation, function(input) { if (options.interpolation) { input.disabled = false; input.parentNode.classList.remove('disabled'); } else { input.disabled = true; input.parentNode.classList.add('disabled'); } }); Array.prototype.forEach.call(this.inputs.offset, function(input) { if (options.offset.filter( function(o) { return o == input.value } ).length) { input.disabled = false; input.parentNode.classList.remove('disabled'); } else { input.disabled = true; input.parentNode.classList.add('disabled'); } }.bind(this)); }; this.setDefaultOffset = function(renderer) { var options = this.rendererOptions[renderer]; if (options.defaults && options.defaults.offset) { Array.prototype.forEach.call(this.inputs.offset, function(input) { if (input.value == options.defaults.offset) { input.checked = true; } else { input.checked = false; } }.bind(this)); } }; this.rendererOptions = { area: { interpolation: true, offset: ['zero', 'wiggle', 'expand', 'value'], defaults: { offset: 'zero' } }, line: { interpolation: true, offset: ['expand', 'value'], defaults: { offset: 'value' } }, bar: { interpolation: false, offset: ['zero', 'wiggle', 'expand', 'value'], defaults: { offset: 'zero' } }, scatterplot: { interpolation: false, offset: ['value'], defaults: { offset: 'value' } } }; this.initialize(); }; rickshaw-1.4.6/examples/jsonp.html000066400000000000000000000022331225123340100171630ustar00rootroot00000000000000
rickshaw-1.4.6/examples/legend.html000066400000000000000000000036421225123340100172750ustar00rootroot00000000000000
rickshaw-1.4.6/examples/lineplot.html000066400000000000000000000013461225123340100176640ustar00rootroot00000000000000
rickshaw-1.4.6/examples/lines.html000066400000000000000000000030441225123340100171450ustar00rootroot00000000000000
rickshaw-1.4.6/examples/logscale.html000066400000000000000000000037371225123340100176350ustar00rootroot00000000000000
rickshaw-1.4.6/examples/milliseconds.html000066400000000000000000000023521225123340100205210ustar00rootroot00000000000000
rickshaw-1.4.6/examples/multi.html000066400000000000000000000044571225123340100171760ustar00rootroot00000000000000
rickshaw-1.4.6/examples/negative.html000066400000000000000000000012321225123340100176320ustar00rootroot00000000000000
rickshaw-1.4.6/examples/refresh.html000066400000000000000000000017131225123340100174720ustar00rootroot00000000000000
rickshaw-1.4.6/examples/resize.html000066400000000000000000000015461225123340100173410ustar00rootroot00000000000000
rickshaw-1.4.6/examples/scaled.html000066400000000000000000000044471225123340100172760ustar00rootroot00000000000000
rickshaw-1.4.6/examples/scatterplot.html000066400000000000000000000014311225123340100203750ustar00rootroot00000000000000
rickshaw-1.4.6/examples/screenshots/000077500000000000000000000000001225123340100175045ustar00rootroot00000000000000rickshaw-1.4.6/examples/screenshots/ajax.png000066400000000000000000000720421225123340100211420ustar00rootroot00000000000000PNG  IHDR,T,~0gAMA asRGB cHRMz&u0`:pQ< pHYsod vpAg,f5sHIDATxuxT?ݸ !DH@.š8.ݵݡ; 7⺛6 ʼB.oB]ۑwMPs2َI}~k`i YC4Jej`] 0̟ϿV-:H=G}_saݔgUCNziUS)h*Q8%sC`_i0 9&蠱CXEV`ud}Qfzc'.V,V;Z_2w/}a2мʌy}vc &! '咒`|DauJרO-5!\~kaadB]&.tm΃;B}IݧS֞ЯttKމ^J1NvXF8 y>_0 0,I 40A"U(paRkC腛 sS Ԑvɤ#w @aWKa??uȁU43 8>i፰V͉1n{kۨr/"4AC#JIH=t Ka4@Ƹ""m2#DUdA١u:Lugu .(TGOYB F9 0hTr9HC7+l)fVdczڥh醝+,?-j4nr;-y%[ 0 O#?Mަ0%0^Ó/+[sgvW=)ڄJ%CzzPPԑgZR,2 0?*ej fP,"Q kp)waWyՈ8'קW-W-SJ*)@#E:(0@ї>u 0Jb84 OƑwCM-%,L |춝I>.$c=\vBEٔG\u5Q >*aŸs8Li),%3H*v# 0o@34(+Xc }CIT^7o]"dYWFJ'|ѡJ:pjaj ".֩aN-7@cH 5rtSBz^y3?gSSZhYNĊt+B 0߷E%HP Cqsa6$_:qvK Z:lʂ`~j(+kƥV S0 O fULK{K CS Sp'oO[';Z7"U mW+4 ꈮDCj VG0 0A֌f޼ZByԄ=h%g={WpAܗfL+مd>C94Gg|C *K4AbaY- FL#qElY6}VۭOo6 `P}зHǫ-L,!E%Je 5 0@hVrJ )A'b`ne|=ݖJkɢ%NPv…eM]y@ZI8)U'`h"0 'Ϩ?2kp+M[EА5J~{duqWEJvBO|>.%NuGI|@'WAkIaaYc!5eO2ND"w_[צk튉gI;;Vpuyㄊ>=SnG0V` Ch! H-'3 02Ey%w؋+ Nج\ᔸ;/Ч蹥bm5g^euϺ%…˂'Nr*n&|>daX uJ#Υ{hc&U?~yy#DlnzzқrRc.NhL?`^[Ŕaci[b˚5:iXMc9ҷǏLGɺglN}MHދ$4W6%V\4rx—u2 |),(((BD*wjsoOHx~.n_}{sž(-1zaaCɴ1t27YSߥ3^\=8~ 睦Wun|RB&u9eTað 5+0 ia,jdc@QS Xc! Bm4C p*aKK{-5:UKnޫd.Wc,O%hObG(0 X P@M~B>6>._Ny`etvi!{⴮&M-j"·qܪϖ0 X lX)KG -.zy7wUǹs8\;$OĞߍDb+Tps~La# xT*FNMضw k|o*}rߍٰI)vltbO҇0 w/[r+:Iy2 "9/wW EeOb6Dŭ(Vaϰ@Ck(8c*gMNp'Q 6Dh?;̵G7zl}!D}:h.Pa<6p;9G? 0 _Z5ew0vⱟDs}O0ίcBx|)q]]zK9\ئOI4m\d' Ck#2 ,Y GJ@M .R>mcg:uOFNn'nj h 9J `%Y@ >0 90O75JA9<3$ ҴLYVSjǩ}f*S?m⡶=˸9dɳ4L8 EEn,[a"*9HC_DxgIQ\L 3l D?8j^·G^/U?2=#Sdaj51؋&x k% W rݸ' y60vK˫#Htw/GE.V_DS\2YZla!X (Vc: UE;˥IN8vw8ifO꾿NK<4qhY^U&:%.KCbИ\!4|2xco¿s{h[+ZI347kSڤml~6]|4"|{ik_A^5?zxO?4F?w2܁=Q*0_ }&h8246O/^LͩjߟQUKXd3w%mDŽ ^^ZGGFÞp !5| +xKa %^(D11a-Y|/[5+n^]'?e##$﬩ycE9T8Xc>(KD:,QmgO¿O"$-bCh]$'2ɍ⛉[XrWגdj&L8Gx>畺ߥVV흟V۬ 3?zcz@ rzc 's!v[a?)~Y4OΦt͔@p/_'E76J}]S[ 6ig6ЭNCQߔϪF>ӷ聵~GA! x-o|!@3QRS,%a~zPKGe8H]t'$mʢϕA1;^sxм/o7~h7.dt5elFV t W~n ?[Z#<pҀۂ,\f:2 Gc9h8<8aP +~2j!i` #l,Ƹj?s;?6 Lst@5Q,q89ƥ:']Fm< ^_[G~"LQE;2{$LPew!y%g.FbFbEH?,a; ᫉\?RU7zWyS:Sc׉.+]YYSw-6>NV*j$7Co]C' ad~@E, P_c{\&iy ^]#/T5!DcU=y/ Wl$3BN8YC򱵼dyJq\_E_j, ~I' 8`I`yy\=\D*IHd  p)b]BWV-J7XE"KJ;]/nWp8+uqٺE9jk%~G'B TMղyV5DX,SF-ckpR| `!Ou rP2 P.F 'aX d~3x5t4mXlt'ƣ*YC."C1@/Yeޜ]IWUxN~W'Yi/ϷeoR};ڽZmTPF|LΟNQ|Kr1DNH50/vy$1An:_8*|E]G* *uW2>/O)_ٶ/meAU?A4bcr;!Rrz;A /m;9hNBEOT3ɔf&]TC MRlNlf$z,2l{,|]+N F*חg/ {U]ix'zI=X}[6N9UʅaW1tU[>GQT)*2ѡ/8ma0jc=- QmKb8@^ ,a~BOi #g9C > v@ #/ 0.@amv֓xvܹOjoe,J&Ivɺ9TίVסIx: %eeGֳP+i"Ue$+I(컚en.{)( C9_o)g|Z')!麰V"}Z{*ֶ 2Qf]i%ҲNܳ?؏<- wp A0P2e1ၦRX&?毦dymwXo񄎧m1h@N$b}0ČH͛MS=cR|O{jK\яދF/mT.He=¯~ۉeµ'>75@1@LIDab(!A̦0+,2ߑiB GT:젹t($koIK,nL)S]*nTWqweyYVQ'=CG:_,:k[\DD'={j++e'#,TxAt }CDI1.t!$RP2W0̯!PPuMb c/UЇAUaX@HJ-&`R6\%yI7?hҗ$/n:.'A)`󭃗] ,[)|bOӠt>P.U) ^zåܼv4`YJd1YJ.ڂu]Q`= {R8 OW >ePG4b (D^Esp+fQ˼s* OWr :  i8Uz1Za3pL&q(jifDưdj^~fze>z†Qw>L/ن9J*;oJfَ6-f[*\-]Frdʿ9paIEӷtAF0nڐWհW_#5qp66!eQwi/Z 2 7?^B}*G>^.rCz!&yd(PXoP{? :F@ O1^m: 8n|gK2e^TY1Z|QWrTׇ5IÚ=WϕϩtF$|Mo؝+UDK#_Gs%8~e}:Bad&v -IihFzP rx(?a G=ڗC8H`= 2h90i͊Hsɲ a4LgLР80@|B}FaE4+8 64؅gA}LmMotq 5F s0Lؿ9.e]r|e# OX d?s(D ^-ў4 SNd1LI[)Cj=PE|~qwMGx-sY^e=W eݩf8Oo`an+gͣ>#tj0|d N -I/c.Q$4]d 5pQX!GPE&n%V ;8кȡp=A:}[@@4G3<&b"GU82xD&~v*UE36PZCNH7 %k7e} =HgZ߫\ug#-gn3ʊ8I"ɜT84ENi/dw֥%[%]ֹBPP萇L(XKmڃ1&ӎ@+S= |Or?quтG] I*Dҷe{FU~cy04LVJN{pdC= (d𕱟4%$JhPP[ %c&h4aOY{1A%s}SꩴO!<1%y'@ERS&)",2 !wbC&tH5d0( G Qΐ኶K%[EGQ`UCGOW&?Rf,ʈzz7;JU<2aЛچuSk*6(kYTO/!MmM#le5diŶV*,mu+=X)ƽQ3\9abiDZ&I,9A-B{2vF1adpC\F8O2bn|rAM#G7-ehW]V&)Ƥ#Qm-(ؚ㤒ү )5Sh,vVhg%{D1(;5]N+kW1 L'C69i.Oq*naRhض}~r6Rz6\4AҽmZKO4rM 5*]߷neW7Z9L4Sbߟ쒩7,2oQ2`uh[A3h YCZ[C^a<`'#쥧Ohk^CCI6 d'qDgD2Мq q(K@UB&#F:F}:d?D #P =0_UgGieMJȭTpZک틴 = N_ vPr3IVήB>Oh*na$.J,c:6"Ky\ՓRp1چ+SOE70"Op=JA щ 6W!Pti؋xt, i}R.Cʢ;WQ  e'K f~yr6qm쮺3YW  rԙb uj]JW ';]wzgtF&Y.w.PpHt#]Aį9tZ4r8CH 8vx@N:^(ofmJP[0;?F!~ x&o{/sld<*IiOǯveh< .55F^$pi@"KK >9N`O''H+Paq~~.M$]q E&#Lq'{h4F6p6"F^!2pGg4`@ a@!rGr`0@\ >6PH%wGACD/jI A ` @H7?eA'x2?nCQ rr0*@i;e֜4 sm#sE O*D5TxI)m9xI96ο,ҐE{n04&INzVS.cm,FtۧQ76ϱ9l-b!oY;Hkno=AϮjW>7x*+C}F;H'xfr/EކAKx=;GzwqYFMBtZAţc&io>/~*J2;mvpbrӕEgpx}v+XcwJQ^^Rʅ*M"ؑ4%؃ +B61\5z5-:Z/ i bЈH ̟ ̟ bDS_\vZRp-p~MmyqS|5IىΚc{,$v״ψnX98>b_hҲ|NGluJqd^J%Jl;iS[} HyL7㻪c%WߋSĝ.~-+>L6K%t@Y[ErYem"[؍X! '{/2: - O*/Q--Ȓ7. !唜OК&a0.pt'?W M7Mҷ/*?{N)}U:uՌ?}o*njZ #5[gGl- Ϩm'Ƈ~gZvBN|D҅s|v ! #hE2e8?f(Kf/Jc!%]bR}~A6tD G1L(B4Nk:t &!ƙAc y!7sV.>>qa;#(PÄb$YX`ElZ̗!*yτ8Esg!/H#]k_#լZzՠXdzC;ݔhBiJQy#Z_~틊VnU8jU N稜&ޜ^f(LٷTRHQDh<֣|12ϥS%40AYxv4G;}V&KYZYV`Y(~ZUΝ7J?d<ՏHsVl"+}˥YBi]6M+zqhS2V\6;g %]IuR6DDKuE2o/9[fZE[C, [r~Ύ,H!ax09^Ivw\19uŸ%d'i#óA~u{7Z7)Q\@s*6WvdhW!̠pVf`" h2^BiX5!͗> ` Ut$^~hNO##gP"*"bG) \1nmVC 4z վ#+e6){=Pύ98BuwVhG 'F j5ɧy<ojIpHB@с8ůRu`"]aH"6qOFA8YˏV<3EukkkUqn+ ' Rt+wح{'4 {ZhI@cRH.yoi:?yMKpyJi!8 NwW{^I.b޿X}P͐o׮ ?xt~뮩kэ*7jݖy|o+ e=ru+7!p"u2%@RR%^ 9CN{)mxK#]~@6ЕH .T&LjI a ZopARW$Mj8m noT)[t.ݖp_zY)~crC̗,&8+߼ .l0Ĕ(E&t%d,Bְ_^pB_1>6\%rH lkiES}֛*U/Nx[>tDsi5 RJnN a32\(b] {4 EZ 5-? ]E|p,2 BҺCȴ .S[\ٸ5H?S'\~3J&(SJ[1V+h=(ԕچIߌUD{_Hta_y,nmGz=)#oQf,7Ϸ^Bװ5V:%ɝ*u0,-Lhu Ύt$d,pI|Cz)ъS3AoKȡ!A M}3)Ltazw5~8cfEly@UgիuQW[X}Xe XBE8M cpCW/NDT갛/)>F=2pB#C\# L?MKZ,:[Kx}%itΒVrWbF9_EfP~2k+] ]M!}tI@J7hD҉%aR忀U0BeI6B }wiuܢUчzxKA bmZG>n#*]Z0!/$*>4Fg5LhiiB\B3-:bPtStv²c[E&wLI>0R~+>)C1~"o-0DĝcZ'uHҭ|s# Rٲ\'YD՝%\9,OrSչ"_b#"BKψEIb (s"@Ka*mNZqBGRx;pG[C` 9x(0'b)y$uX-L8M)/-e^t;ooQA 7VzvV_୸#is2B@}M?]{Xsb6 o>WMSb,lxeDL:w I=FKxe]V)8H-{9ڡ3<5: tpT$O<s{ M^S7:|}m4qS,: %v"c*|!}n^nbD[bN7~ ՗+1/jX*ٝa8^ژdogO-BGǭ..$]#)R+dN>Q\0^g%|"$O=Wyoe/2 S6՘Q8wzJ OZWB5rH"hKD&T0_Wɾ%PLQt^iKt|_,E>&.rϓDy>>eARm8dKu#X*UN߯~,(Zd8WUmoKdm^ܫIrq3i?<`=IEؐ*X797~Q=z8>JxbP.39grTN]#d qI;5FBul5MW[U(ʯmIa̐X( OpT-uu!JzTt': t:#VJM8GS}]I8`I-N/=P97:sȕ6ߋ I+eL7T.E^*;u~\G"AxaYx6`^ż9\À< e[T'ސ ™Dl`(pFB!C ZV$a=HͿ{ 9~YX4K IYr%[.>;[Xq꺩\ :hN2ʩ q/wKS>VڿJ7CIsݥဂ1Liɛ(ВTҌl$&$/1ǁ|QwP+֞Nhb|e 9hš&i'n+L:R'ܦOE2-};˺Y4py3GFbXzk$ K/k6 >?SV\:A4:2 Vn7k_)ֹL4t=rV<')"Q{$W ڄL4:;{؎T1 ΤHO>2xhBPhL",=Kd_ 0H%{Dn . tvyg>ٷt3_G\jkŲI1o[`OM c4q0MI;˿W.ú~>`=y+DʟzYLy7"P``4لp@9@7@7@_B7ACjB bczF cz疒|Zy4ԽXv8גsVXEjr/֑ =\S&Y]Kp%]%Ab eo"WtlG{F%8*ُJGaP;I[( |q q a:(oבK~z6c%b3'"A@" DyY]Ή4/?$5JZ62hUnZa;}gţåu<>dUM's@^W#ǏコM_ [(-4 7NdVB }kԜÃ/`^4OV`#U 3DhÈ{ nk4#H 2(,芦p!,$!G D #$pF)H ?(kia/}0BPxHA:tV Σ3S4$d7f۟+R W)dܜv&|n1w&YxV=&.zӑ7-r{~}u4U}2ubr7=WS\^Ѧ,gt(Zְ0@3(X`L:o+a5̯ PYՙ3C۔R(ıN;h} kUq꿮툙"-e G 9wԅi\5aj,Ieؓj7tL~,1 %/LD<-ad`9ZIB DޯB5?FB$~MG;''-Z\Z/]o*㡒pZ%uu!rmIt2#;y *x>VLE!7z BҶꑻ6yM8jyF&zo_e ?7?-`\(3F!X1qKH ӽt/b0s">Lt0"*‰&ӚNp qm,pç~G>0\ ijAF-w Q\.Л:43L5kg"*5ϓ q [nidqߟ/frqkA[~2D̑(GVӛX(6 Ǧ&׶y''*5,gզ̸r6BˌU'ܤ|8G [\NgEB_ uI%?"j$-P xS !WfHq瑂|C'x<3 IP2>@ LhQ5h /ht'.p }e-FxF/kX(  zP88 6Zp#IsBTآ*ρsTN8JOhKjG/Q#F#L_LKQ)mgG]+v{:DQwRfgͻ/;2vVUƢņ9ddmE~^eJsUL-{KƻmxOͩ[3i%;⯝nY2뿪r'ChLkOb4^cy2 A/ /ѨdBj$F.N:QX5' $b2&ӇxȦioB%T3ƹ7d*J8hrAËp@drryu'<26e`O]+vKKsKܓݓ+ gvk0M3Mt[Q؇}`xaxACW9v<-=exB@@v3$;՗^TTs>ê5_GRSSx).+.ى77qi}P T9C*gFo+!mIpְ-İ $=$ İ-$6QKW}ɑxԀi:-ԍ{mZww2Y7e?-<2l!qsN8{M޸Mҫoz۱yꍱ>L(_7 wqXqSz`Ireˏ(;V[KM6E;lOmZoײ`@\!; T%;PV`^!t6 iPc65^55Nxģ;a]hMQQӉk Ӌ1N2W+ zmVmifhPJ:qoKb>.C蝹k ڠ4}D["BPHd=z{E .E}CCe2BPv4VQR2 553sgBa0}}DW֡֡h={\ӹU)EwEwQGvK%lڶߴeKcd$>m؆ڂ94Fc{^'c?#|p2!(g~rF=m͝Hwh% Kp^xIۑӨMnp{{.7p >DjN߭`FgݏiߥJ5Z.RYͦԋRoz=iI30,sS>ʯ{WB*dN:!Zݨ~['YVp# Gr.xȢiwzp i텛(2_/a/Vlڀ6)az k5)Q#51DԂԂz^fږ9$sf)6797YVTԠ3<6<By!pp0n3n* M4JVVx$.i wH3gZ]<W;57ٛ$zz\D~BW+mX. e%$8wii< 8)_)_ɿen _4R]_]_sRR!G7J7ʔfk+4m(l\XXY μyKs`kV)vmuO3rMk ߆&^ ^HFHFpU8rr+WU,qJreuСCsi={;w:d:dJz8,(%J[K֓d)Ns%Z *Bڂ\  0[b/d**GRth-@HĢшq,݋dljc ޡ]MxΔx#O/ellU~3. RLY,儭 bu\ؚ̄WU/@*Y e;,P!P#(4w"P#1P[iGP@Sh P葌dYJ3.@?XXk,Tɠ36u+W~~03VJՆBTz [[cY75etA(0spR+d*J*N)N n}/)IEA|A?ܶ۹۹K} b}Xx񀴢L/=ݢݢ~\;KPB (n6LZ^,'$t0T 2Ttmn:h`h9zZhaD.r5h 3,rG#@68z7-S4(YT:ݼy[rBsByu>\Π#,|M5M55; } }u/XXtlL˭[KYСCci➨||ll/oxx"H^xi4n yp$P[E(-Ĩ`eP6)C=)42Hcq%҇A,C1b -Ͳ@;0ݛ b)^N Χp t2GL? Ҁ4Cb0 AD7~߸ia\m|^Q^Nkk.*lP@w88mZmc +NB[4\YYYYV4t5e7DrtQĪU[Q3'o'o^zUz[cn{dSu겓$cC:ҩ66<'>&>ƭ. HEmJ,P@艫x@mԆ 1<,!'z"@ nP?#S#&a*Z(oH3dD!  HOXgYG_E0YG֡6`B g(zV0IXYX[HHWJ1=czu4FZɏȏе*YS/oBN"ЏÍgHmGڎD]AT(,,vv IMIM%7OĴ*4#hָ*<~s\\eKoHH]ܻXmR*BŶnVY=(_-i%i5s%̃Es Nct3p#0'QP ς̑A, 0T"cXY>`+>Ãl#P2|=+|_ydz,ƢoT)Us;jj% ^iNFSڢBU&A`ZVNNNN6mKl]gΰ/vO.]e]^^mGNĉs~ ? Ͳ͒ p HNKWZkXClxGȶ\¢$s9k9 }瘟cY j~FPҕtb6:dLCQ$Ў#.!pp'DFqXt{U!wqb]qrT՜PR2k@;]yPy(ۼouwwclm1[PԾxIHAZ00_\_ҟ)dIu(+V!ɲiSG>B4.5HU< *,#J ڤ6\-_&h/R@ ZFb:`;HX?HVMDVc5"/kK[.Rּ|`C>oxjQTdLAEEˊh;i;w7''hrs.>U|/Q.3'O4.\آ"vbeDL}7o~gg`D#!$L9·\qpɐ)yw:@tAd"MMԁ:P#G$c P8@ )xs`-XZVgΊ&ffsiG;H'~6"1}Lڭ[/ww}Η{BsŜQlijafl\U t^>#nƲHVloUS5 _..f4m1Kw\w\(>뽦JZWsխ*lTH:k~͹07D(MM>ābU^k.I`Ua9sueM)x7nl#p|]Ro!~&?oN0KBm-Ivݨ*G%08<Σ%GQa;yi'Ƙ?J_렃t [dlQ+np 0yKZ!IH&{{zU t"LLZJV08fnM6RiJJo\'xBwwwҗ/Qkk6.Hhoߤ?u:5Ag12LM@p" IC@ %t4CO1m3ma4aM FRB )KMLaz^ωq5h>H#~ޚޢ0PH&0~tj`Bo)d ٳgEzID J!whg\v48mmrCO| eL!!=]{>Kk5m.yC Bp6 xY+:VVMh\$ST=~QǍ<Ӌn|nނ-xkYT8#p>lMч 8@~s%nn1ct: P3 44meiVhVk*([pU«..ƀY4hK_ۿk' g3DMMMݑ8ooFkt+;+;w.YEqBBIxxQiicicp9x(@9ZZ1I ڡJd:*d-Y(ptLG%La7sr[," s1:OO7Mx8Dl6G&{E \E4R0 UU59rݹd=ClvDsV||iتllH H!PoQz6n٪{{iFݩ;E4A e8P%Q+`8r U "1!ꦈySu=\mH_NS?͟&.zE' bn1a/Eo! # r}"B b= H@1RvŒbMS9@؎]hFGڏ|h3E( 4sbi-dMoAdzk+*6e32|1om\pRvnv6QAl ''Lnj33]z'ɑTC] ofLv4Hvݹs'SRd3ExP祲zzmm%%jegegiVϫ={Z,:Z0R$cYY7U$ DDpp>N+8dd-`nxCCt WNV-ld62q V?rxWbXb 9H>\5rA@ b-j~NGw 0s'tivB'\-˸n8 2:3|ĒV 53:@eTP"wKDa!p䣽V㩠C}>"aFOGj߆mx ؀nM?ǁ|Z` GٗP>e^ʼ**IE&L*YQĢE+ 5;5;MK5'˓E8|#(΢.[\Xշ[ζyyml6lON(yaj' qq}8 Ir@2"#]>p7:7G}Q f0 Vr=ޣ -~.Dx$<^jYcV,xs/2,-3j/-B&=O#ȉ<s\[\F8B8f?# SL(;ESSLrLa_žtKOS]ZiZ_֖eĝo&y /!c/-hp@ $d  C;1j҂fa,IYb&OI4m3ana UJ)Ћv# TtL'* 5]P#PeP,0 ]֨yl 7x|$#}|[#P &a Wh`DK80 EXrВ6emq߾ 0 iVaa? KgaO~Z"zTXtCommentxs.JM,IMQ(,Pp 7}IENDB`rickshaw-1.4.6/examples/screenshots/colors.png000066400000000000000000004746561225123340100215410ustar00rootroot00000000000000PNG  IHDR, ,*gAMA asRGB cHRMz&u0`:pQ<bKGD X pHYsod vpAg,_IDATxgŶ_3sD9'%"HR@DE(QDA@@"Y2 *AA"( 9ps<9w}qo!"nsю!888 eO?jZ%k\BI(g܊y3"oe,Cy%C$0?4py_45(> *o|e"\!ݷ#k򗸟N`ߝ~;Vy8S| ~9+` -i&\ Ln|CE&u[ nϻsu\D(h_0) (}DOed.nY|xN{o J~anipy_$h"xC*drkmpj̽ }\l1#.T?~>! 5[V\W @5:(tpɿ9qp'vЃ!|\FE <)41x"#h63M{,|h' 觝>rV>\7raTH;7a )r 0Q64ې}xI>P׀:ԦМ<8 LY \]@S*?q(K\yȮ3)ƒ!f0AmFu:@Kд jY9x;*chГjKv 9W|B< )c ^rV]qݹ(:}]@X()zdFsx1P 0E2$s߭#mzІz̟}N0*{(X ،ٚJVMy`vNcL̊Zh%sAN;1֛a:V:3AH@?g011JTe΂޼y1cy?43-x~@)QhL7ZD@lq Ғn8:bwp,ȸ_h)/z-wd'6t#& hOz \UsE@OX ŹF,?hJNk}u0^6<0hSCaGx_ ͥBSn5f;;o#:S+4 d06=h:Fw;}y`,}s}奬Z@?㰿G< W7R0󎵗{ ?bx< 9EԠubDNo7 A07\@eKT=R 3d@CG˗FCLS9(FeJ )hi]|7xBҲ!|$|!|2hlRq`[o9[|%@u<) F{ ٮF f519_?h!ዹ#Ams d*rb'm0 |휗@nѦr q*|;/=u$xǟy{ETt60_0σ8N_Z~`hO_Jkld|**a%:Atω@7Ӧ@no3oC?%xU ݣU14 BC1/?<|ȿA C2m:O~qD3^ PK>PTQ<_%8לc%B9.Ohz(lA-An3yA6r=b<^[~sg0SAFՆ\p3رKApg7;J[#EgG }ֱ֑![ɒ 6`,6?HeVv}-36k9{s-AO"1G(9 3^CNykA[9;d }x^sfkqbr EmТCxzk@Esotuew@_|! .#ڜ!n{ym3/7uGK:R&݋PFrP{>O_fZ,ESzZVnBXX <œ|[~'dG$gndXF@Lh^eA+ƋyZ2Ǧw9MZg>4!vMך ((9w\]h`0- 2Knz&%"_|zxfw~-S3A m,ذ- K)ț s`з[4yR^~gdNĽ=`lFseŽ, d[nBfQy3'*K3H}⍭I)??D}iEE{1UX?+#L\R*qv0&kW\fKCCxI JuvS|e݁t•g;8d@)';o҅?#wAs} uERATEG0~ G 5{\΀s@0&{V歃SYx,U|O^}4G]A~?~Z1#;x6ٝ -e \DZWRmMЎ-@ϔdU@1(~n95Y]AP(n0 t1e hEE|m|xRG煦s=yKN̦6,=^I0YF?pwyT^2c AhCЛK^ å㗇 'oxТ`نEگ/f9 N4^ ! %,$ +-H%}Y2gVO<_x?{S!p7GE_ZӞ{1oKxC*z y%7Y{6ḷ&Lޯ? `cb*8߲V>]&r4xD ?kn@ b*IGxA$ڝ?/rl=`aj!8^ۋ{V/4@-uw<)dwdy%[:20GS!T~Õy}*L%s[Ur̓eAZ_uW~:-g^ܽN;P?h-A_@ h]2S0dvexnQs I 8b@edW3`|Z\=3g`[OA=}5``'A̕ ޤWҢNZ<;ײݾ^  34n038ǜlfUhJu~7'D\p NwO3_2w{N~/X+4gy7^3X}Dk  gsTM dߎ/|(X`6=o{wsofoзw[D.w=\{L~h<=i7_:A{.ZN7/Ib1j?%q~ u9§ g*1Xy|wq_V}Fhb_) mh%|^m@TԧrfJx ˭'nb_ } #d M A~]:@b!pћ@ƹ*AW!'5~F,xKwFBv=Xf5A kTd,joO'pWIL?7,v% ̚ lc8abX$C`"\+tm˹914DŽ@~%9pp} G+oMPwUpv̯_y"o/4b"W}_BS.]JQq<')PP9uHNm!c/K[{BG@J9Rowkc<=\>y[PP>h` ZAy<@>a0_Nxzҹƽ'˓<'ɭqY-goζ}x~yu1{e2T2"]쀰w NGAN5OԣuA;̷ufCD :w@ZKi.Ϳ+!ݢ6`%_rr[S<}Qto9_,GJd#yʛJ30'hյP-.Y3Gv7<0h.Z*h33/T@zu+d;(~MܵXn3DS[ &`m]+_0 87|Fվ:14墻xxWU̯6h{y Q[`h`N1ɉ *!0yf-RO^R~vޒfG7V k1<;pЮ\Lf~h(hcAOӍ*hhB`wƠ4IpǴ8np/`!vHT~U]s@x#˵ ւ1ۛd/WhL#ZX!5 L28 U/ vBBy`L4>퐡dμw{JKD Lg+gS-UH=z#(F[UB~c }/O,{[j(x7,G E&d|ÁɾMVw[rm r㱋Nk!-|*8mf{` &\|씳>r/ey~]VO2UfZf_3/+q )T2, mF hYʦuzQx~24qđDM 5`+ PU7pwprL et.`W+k=z 3̽pV9uf5:Fq@IJ&^ vG9#77 E?@H !/ v?#:LG?g# dl{\"9M!uGo7HWVoq59Wz`kdg=gp= R`*}Q^qDa)_OkcE`&-U*0EAi[ mwAj y{vNRwC7)I4Ӄ ų?¿EC-j#>#μM_^U=Q /.; ~pNޞ؝,Ιe6;[Fk#+>*X b!POG]<*ż:S.q}ny>~Ly!:[2&A5W=^ڭ'>d{Ad$oQxApVǹ|3c 8N3A2P@[L;5mv0Nӄ@K秎Mu!#%z %EqX'b/,T9 h` 1I| Do)o>h+zۃ9){lp'߲RJOX_7Dj( 1 'Dst]|ZVm: ;dQ1ߪHyO8OAn60,4P ?z\ V6N}+wk_;7I<g=uOqk(Г<ء١ZpuZg7ALRny ؇gGrr5MK҆@>#G@>.! > H/CHcBBY?Jpq7|/- W>"$NƷ5󛔛pmg-p9ʧg.-r翱pkNw2g5sv^E9At]D_0)TWZџg@|.~?^WLYTwSµ_}NʿeHR;!kS/YͨnשVvdW䷦!@NۏBfR6@N;+3ԹjOA6d y-CW%j맼@ЀV?ъi~+\f2Owub0Kf-8fΟ7ra2qn~Gt1N$JP͒Pr]= ^gNuppl? @3ϸcaAe2Ƚ@>S p r'—Z_ﳾ`jS1GfAx,ļ5܋a[2=@eqZzSY O O/unKg$K One\ _0gt@Ճ3g*/<%eHEZ_PE|όE:"yZq/B`\1K[((A!*9]7<~$^Qf:nn` %9K(D?, 99/%}[`Z@Zt8&>b)yϋ 0.B\Tmlϙ@ <EηӌnTVsx/Fk X֙w!:dT6BR[Em#4si=1`rkmJPP 5y=Q8\ɐ8pq b^c /AٟV_ x$p]qA4e-qC\>V- Bф"#X$ӀU+AT0/3D4=QGa|n"$6gj{Yz}8Ʒ5  ԡ8 g,g7$/YU%*]{}xU`x{Fj^+{pvBPRgG[-} bGPc5 _  抢.~0 @֕ %}O?u=ŀZJs,8fU'τ^*~~zq 2!A{9C3-]@ZSmVdpHsU1n.%B{Q>2<, 7Kt( 2DUXzAL(f_~%2  ؼ L狗Hkb%gbl;hjxV[ ,6GA]5oxc#}b߃lpc0ZCh)1gydLef@t\|[ip1`(,%lvx(VH|/XM< mC ߣ|VA<09bm{̽\Z@$Z> BfW@uB8;3 `\xOU9+rߌтm ZMcl'k=| EγLe8 (rĻN;zss.fF&8S[CgB+K5Z񔡃>9܆(3=ek%/#=ޓlc$L&)JT)eY +,a儥)(*_+A.d1KЎkË́*>s9uy {WCsihT@`}WO%hɽ= ߕ[5hܬu\i>k!  T6s'zbUrA|[¿m9Ԓ'zuL4UcOX`@o7fBhThA0DW. BK$D46VV#RY~m.kj ړZWmz> /)OVbxyzCn՜72a )p? brS~V1km>n~* +uPW7"e G|&.$ 1yJnԡR& Sfh ذ`dx=D)ʾ?f~<4C|Qh F1 @6Qh##X8he. u2I/&ۀN0m((/h#Úy`֏-MUYpWD1КZ-*4ؾ=!uo/'$z7/T5 0ּ "E\"w{tipJW :1f6p3ĬH>ngg}]@&Cr+^m̅@gW]_.R$7N2KVǣ?Y@il>v uV|^Q!7@j3S.zL窼WGhO3 r J:w˘_]}Kn3Ң&RԠ?]f"^IGœ _GEA-$u9lfP?s]wҕ u#3bزSZVE+!5ꎜo@`f(1Dm9Ϸ_m; Ȧ8b [i 2"hXD -#(QO 9)(By)~Zrx)CGEMi;Oeybj;hn354DD Rj^ A-o,QU hN4`| !wqXY339^ [LQ0'GS. YFftwNw1yD(dk^ ꬄo!qZx+OU䗲 Cd;@5|KS〵P_g!_np|VO+h 1]Ce@N ) &qUA9n9,s`LJZ %vsB@O*!FL.{LW+AS;Umʖr3hT >#Krcg)+A%-ʫTYO[{9j `oQo#w, HP.s ZN7ƃ~K݄ws>ȸ?Q^!| ~ &]ԔF3i&T6hM{,$ceqA2] yuD` rHN*R@A LXEu<1`+/iqo z *"(|R}fp.(*) gnnj~HP#'reŤKmKaKa/ lyoьG-D_QVo 펦`\4k곀Lc@-oW+]KB%M, :*8(2![ޔ8f:)  '^:.\\ݳ f,qRO$7l(Q*mjӿG#ysY3Xw?7 ZH[xM PX?gVgQ(ԥӐ_?eXjrU+_n!+A|( KRd/9F{DEQBi`=Y'(X&X_v=lA#Z8y7@j o]h޵d,7&-A@o|ٷH[ n|L| Vx\пR NI!B {|f([Z3О}muz[/%oq[;JsK(g zzAe0ڀsm|/b>}uSV"OJ;Y A1X.|ph)UGhe lۅ@]Z(&1PKi?),5!u6伐N,i Z)'-@<.JZneg1.QZYAS3Cؘ1DAͶ ΈUr/qE;!&G)vmZ: Ƚ9xJxq`:!jZ+MAm=r.PO`0Ml=!x.wN~eP{Ύ@+ai`6NOV>2Lt3Tnu)i?!pU/O+r5Rt2;OXQۧ|K#*@`bY ]K@e` bO̗"`\/xLW+ %ђl>s0GܿX%V) &䷲="ku3ͷD`P`ș< KrK6䷉[f'? "3zA;1cKK)"߳d_"P*qU\ilJ B(+Ƈf ^Ln60 J1sl b)>0Aodȳ &J 0keK4?'o:YK֓VC 1ˋ.>a ]r>3D&FfG]u[7oKVĵcD <v $ƶ2 >QOXD?$+7c!^܇!zFn2l,J)g!v/COFPtb Aպ !m"C@FPBG Fנԉ8o{ r9>$^{beZ]._GmṬzU[8ۂq| mAl |$d粰]Y3 '/2gdZzg|} `@(<^sE]"C mI #+RÀrr4!X Vwm G_ t45k-NNZlpl֬[/VBNY&ʁQb @fXݭnyc6, 4f A8!9bRBDqSxc`Fir.q dYy,omPm1ldiZ \\Gn+.pUiqɲO>1OBɻ7/zLy]x&Xf >J/j;@,DG^J{%s2`<ӖAT}s^8/ؿKf!ȉ4ݐ$T#Vɹ*pʍ4D* $^\']ՠ΢o ##7 ~5v$K/%O91c|C/Ple%8Y΀VKN4̈O < ll |=JP[0[) 8?[rf}wc;g@V^l9D.{6k2oG| BMSBkA;@ur=;z b+Sw *n n \/~2:OF4!Sd:h={яk@t@/z2WOPw I`. y{7*B bX Y-8fX@M]W!Il㸧7DWs˪`c>^V ( r~bi[Π  }a Ęmԕ@Gh« % B%|!i@uVruBԄ"?_<^94m ' Ȩrn( ZKJڃ7u : ُz.C%y?LK% pokU`>fX[ hex+fyp\'ۚEM޶J=i /J+!jfBxsFAV}z s]ͳSdkVJ"Ӕu`:C8-q^, _\AMurlȯ;>2TYQhM@rJ&pfb 7x bg!RUåC@;Uҏ9g>%K}d*꼭D=+{,>hmE t,C=!}-7{e5;SdOkH]jП | Zo&6MY_?w1McA2u@޶#㋨If6 A~0e:,{xKil?GE4+l )J#<`{͢erpuG;VNPGGn~Ǎ7t?V? Ƃ'f vpl2@IAtWW?l,[0k;AѣE痘 b+Ca(!) |#9b`a\\i kbĎ yPt OnB~5>ڳQ־`dk> Pep(&QZ#XL  ~_Fࣀܿ/ hMic~֝ _ g9rE(G^(v1q?:F9Ui هm(fShp#!we H(Uq!/p[.` (G]* L 6M_| >C9 134F-JHAs #zҼ-M<Swο>2EwGR1rX8}(XDQC Ń̊: RUrr͖$v+{Aˍf < tb?M^" Uih mX[@P0=ЮoK7R{S@ rA_9G@wig1r|1eoFU6ցلn2 xAsXMo:p& ynÏ"ھ, 1Xa,qʃ%nd:j|5.dr  ΁[+j^ E TJCpY؆EI/B8uWw>!ږ7@4,M@((7 T#wwAu*\a$+0M}jF %KXs S@Q̍ Q `TP *a Fs74XOXKYw{oa%oOв*0@ Xb_POT M9 I@E q{U/ {Q9`ێZm_ź@` n((!;VçAZ?] I%V[{폱8"9^0.of3!P*?+!"'>*PDRF OZ!z?{Q,/.zxj@@o#8Ϻ< 2@dBܟ_GH,xa;Yk[G|Z(HywuX-Dk5eBL@0 D)Q\q`AH)"K ^`+|)>~W >)T7Y`VNv?׼]Iї@5R=ʯo-6{D1AQ Ԧ6AUD{psgeo}7/N=WEe `u( :5fGj`A ,cĦa 9 Sz};E==겇+oCy6$8QUz$Y Q)F,XE &@lb !`}'~`9GzbMAV> @M+ @NqZ9 OY`k  JeZ^{lh2WhM/bϻCS`Xlɞc9$ ;-M#[kt*ɘl|CV٨ 2nt|gi4ust6C~d,e:b&:2M p=Yc^OvX΢^g\}}AV6d$(TW]o_{ ., '?6>zI"e{Ayf,KlFH/%&̀)v圵Z lKb@쒒Ý!LlX0"!,OFcR\ O-σҶ𱍻]jbTan@Ty:Xs;Ld\/1 7 W'Ew5H]V ze}7g^pW ;!t~/^_ ps}1xzgA| W(Wg T"=kًT.3F0W_>ӑ/8K݀ݹM3p)'!](Dl-ŀ&_{bX3ox}6r Ί] ;rg7Ɓo 1_|E.;2ҡs?sįcY<9>z}9gAYo&?ȷ۳brkX#3B^rpޔ=$4_+r%S:$!WY֨ (8$Z*sj1r^@^e>kK&x^+x59`7V!08,ˮ؛8 ݪuGgF1E^(Bs/X0b@Cŕ.ℸT10Z Jƃ^YZ^$ |bY9bքΩ*6ڀ;{q |#=`/MA<&z(#T7Ƌ=,)5sfBkRւ,>GۤJK/IԥbhZ#a?h5peP?CU@~ ɑ@qc ; 1K φp=n!(ʁy. ʾbX,ѝ=*(DVkqsE]DJb\b@,zS(_yPX[kXe/^oUSPgƅnEs7x@·bB^JFS糐g V);p(QHsOĔQ!+۴1ݣ##X|&bˡ'uDy]'ܳcJ u:oV JKk!pps/RhfD,oF`>kIH|$Џ(Mc[uvjau vA I]~r8 L?@oc:E꥟{;AV-{ GyH6 . r\o8/mX72GAV3[Cpz(= Yncy@\߉d0{[Ly=P.G`RbDk*J\32zۀ|r0[ FuxM  rnvOZĽDW^&X7BR8 㶜 4 ť@L ;o3h獡lH6fL1 Po{_-. 㘐b^2 9a|T>z@sp o/v,bZu+s<0Iэ E%7[rX;)0-峐{*hbhic*Е^ p[P|J-#Hv3K:xsuAt%,ah, Ҹ R:Hl/kc#f~BU[k s XOg:|vBL(7D4/xdg@,9O.㹿 6׸D8bXm9> jpL|r7k.-bU&e'Rx18/Np0X.Z>͇Ĥ3`{%ǃ ZB 8P #`͋tT3"),*gY֟{;BC) Hߖ@D'b,*keD+\V8A<w0 /MB|%CKM1Ai)Zhm4whl|e+`{+6` Wz_u<Me޲`h[S@+c n؎GȁS5 .* y_Tpm-UW@[=F> <9m7)Lb$wup|=R Rp߾A]l\W/g?# N𣁯CIp`6275#>4"~.L2ƃHb5(-[,@3g _ǤK~D=Vf1b;xA3'6cB}Ց`n4Mzt%\̣ -L+T !1\ $Ǭc/.;B (XMcyS4z_=M Jiw\"dI Dd&\ԆDKc ҖTי{(va!ƃqk/ lQўC--* =mWlm~Z/U;q-ǹvwM)fW$8R\=@?cL% D37@+ǵB 5{+vg߄6[ՠjaUv52߂Pij_cB⪈!{E\+@vO͂`Nf11 .4S`}?8K'&4 n)@ol~hMJ2iԵf'~ػ9v[ +>wlgie!_!Yw ʊx8!Nz/vqm@jx2"Θp>ﲝme;|b[S!F\W cim/OaOuL$ 1@\٢3-`l[2DU%QWvh\ŽC WĻƄj*[?1R_CᯡOKRJڂO+%;CxW o"A+XAZ,f>gd'+;/qBa 6KUm9 myeMe ܏.)>@ d33ͼ2]a|G҃[@L13 t^q0BZ@{D8,:(bT;&M0z6 A_{Ws=Q54dv̺&Gq*emmz<<1o xw;&Bl_Y[RkA޼V!X&|XD Pffska4ӿO}U6 1[4WFY|֎ AVvt P`'X30+V_j 6Cf ڕ zw}> h"ј? Ud 2Ovh_/IzVb8XSZT@e_,;DM H+l§3{X{GfPgTEnvDKܗσqHKP Mp9W!<76׀x{ifcŠ>.J0_4ƚp͹a/9-ϸ :34oBruD/j{(8*V::{ʃ !@j("W\ ԈP؝'n'Ĭ$$n_%5֟Dw ~h7=; y,,X}r} V @yg7躤96,-t7:lgc@~.p*`P2'-H\?#@4lk`uK)Z%@#1=yTK+ I4a@!*c(@E $,5nWhP#r~JG{E0 v%M; 0UR)k Vf\튳ϊ NRkXu%T< Qƃ =|[,R9nr$/֣wdZYA4]ޤ%ߐ@2\\I@sʏ@v7PI;-օQnŝ{Ye(v&x޼6>ҜA[S` h? 룟Fȸ|ԏlP5Bmwgc/KF3UDU Fզo@oyY>)t@} 0c`{h6rmqB׿h 0IyF'#@E[oN`|j44)ʈ:3& z HC.>MdcUy [ p HGސ&%[ۏ ;Cvǜc91Y _5oj]}xRs Di4a@SGn|r88YAnͼo\ 039x n)gK AO;7<{{zBZ+cayM+m=NS(%@Đ@4FmA?'Ad~b'7{5!<`)f}}D<<' Q7!4txzx?=֋A 2Ԅ8U}`4,¶_FP\ \ ƈEgG!(_Z(">z`N܆w+ Ԣ9A?sxw@ﴅ@ @y[*Y_3&X ]= 7eoNƳM\`4a9CCV)@.0w =/rܓSv`/H0!xu#l, [:I\80G֕1@(~|ӁbxYyR\I`Z >UTȽç@.eЌ&|-BuV2GRX'2&Š[0oϙMs jO >REW&PF{b](F|-69N&g,A8/ꗟ]cYaSOm̓ ^z+Ouwazg .A7;pv1{(<q>?/V@tՎ?,%@+i&g@} `8~} lÓ_An3 Xm> bik\Ҝ!ax(a>j}dXQ퀝r/ Il `n06 D D=ꃡC `oU,e1W(˯ [cp\Ѝb6@X ;]$XN <YN=W1i8/jEO+z2Xwor7>poΫlg1ШM&!{~?CGRP"A F3.b\ۖFPoYTWa=?AXkfhc!w %QSD50j,ȫ-3ւApoB~LjO;2e%:P^QVPv!)ج ?hOOI9>;@|Hҹȩ]ia~&Wdo5 tc@(a!!G[iSʃ\ffVVպCui` \amr9e燹9^܉ytȇ)rY [o<~+ꈥ3(3 %.ݝMc$t#E8WDSe( rRn(e,H\"PD-~EO"h4}EUeOˮ:[j74Uv݂KϏx=Bq*9;񟠛 ؁LFgR 3~t9.&%.OE܄ACˠj-s+M`&Ʒ@>[*|C2y<b/\d +7M"M$v'tMqgyS642t}@|;` 6H/hDE:3ć"Q9Fpjb7 ?7KVPyyo#bK+p6lfPOj, #XxPsddR_.Ǹ  I .6b48e?7grVWZ- AS@!ca%pR}@'6>W*7sxdD(`6-8$d}snxy`|e+ZZB$/M^Hk0RBo͍rHDt'\| b eG/QYy>~X< >O'Izpm^0+O ѭR`t #P?a /*>Ah{D:8W^W ksR ͽE߻6TPZkv?bdux+ZG:tu-{dOq}2B&5 ؼx iV #F3{AgY`Jp\x.6 4yK<%\ 5yޘQ1qTj4}VV鿮L6j;#ګm *IsY/K[;xj+ATTК*p k͆-']3=%oZUH|kN}\\ P+wO 3}!d eD ݐbY!yb "=d9 OmG`4Rqǂ׃AV>@4,j'`7 @*>񞳭"|[m^W^RE ϕ*&hռXZ^2_Nz}``0lMh 5cLK Џf51Dx"YdQ9@DyWwqd{i}6H#`,4SQ4cĺ@HHcd|^럝~(TH&$> TdCrps}5u:*WC;R= W]4k{g+;l"pS< ^̇6edB? ާ&fD0 O+ rE㯏c8sYjwAm>n{r 叇DXfL_冬e} Ȳ >?( N r2О' ď\? }r9ݼEdcY ^k:0 Ƌ@*5y G~1`Yi:AUwf DLdpg<1_H#O8Jx\ YK@{ < r".N6WD f?(O_$PuG".d'\q *pG<ćeduQ I׿)dr P7n)`Tt e- /[J9p<Ȇަ hT=q &/BԋC!|`@Pn?[./_'kwБޠS`gF_qUVWRGɣ<)G+`rLa}P-=!,\uc:@nPz^ r1/Ѫ ¿+upP>8P9˻* A)E<`3x$xJO9R<yP|eή+sX[eK#֛ r>EB`tJmΣE9=mx[C3X<wR5OҴ(eCȚ1wdO? l$Jo0ѻ#2`-75O*\5@rCOOkCDqV@>(4q B# @#' gʟE̓>'I Yr\!@ ѫ-G: `=2rQR~8Ax(/0`y=cv,x#p/3 'I`)s p|7Pqjџ$C`'Y 0H]3zȾ;.AقS 255rS n. 0D.8M\G5d;XFh 3qQ n'ē" SD%a@`gTe?(ȶ )^?x$1 [s:m3iR> ?׻b?.:9*Xڗ ԇPyY_c۟!8`{ goڻy4ʀg?gF8 ?oK@U !whdiqOed|*Bf r4:B{8օM@z^h3A4Fy # TWu5]V4 +*=i0$*-dv~cPHnW}#p>SZsZ N \"ޅ`, 7g@} My2zlׄ){S$/PEyR/}xN" NjHEbF _8,?J CIXɣ|O|(PEWZA# sAfZ'XVYh "b,F>BVwr:5xR] ȷ -;+z:(߉rj8*;"<3\/~*ȅd-h}pm4gAW@ qrM,}I91N!{Aud(x0|,N\jH]6ك]B(Ey5/Ab'<@cх`j!ݲ1ǁW 3 .:Wt6-g}h!Wy.<*3'4%PQ0jƋ1sFh@A8HB%& Q4 |oA's,G;nm #A^79C"&Rv$"/ "-3M-h"GV eϟyAd a1𜫘@D+F5b@<$tQpjjZ&-K@ P:W@d??^b30œql#[lj=coydKo;E >>j1@:[ɫ`L ~ʱg'92[7BA}zX\G: @~!G [/lEkp Iu n +b"(p1:w_0ۙIN5akl7C N%y?>5.+p.^8ovUoN-+A.8_`}dl0* JS{S J*/rO'+e]BKۋCWqR;, aUOCC5T.gkx X+pZ惽eHL "xSʊR " 4_wMuN=eG Vϲno$ΏWB*+^O6yPLDO~1  y L{bP+"&=bt{dI.b | j{OEB΄!{@uV @~/aq c,q'zn}9V*?NC}; ;BgBD~! )S̥mh*&Njg(tSh (Gr7RwE e(gpHOZ+O_&V?Qn.|9To4iPjML,8la){Bxݲ.p} y[@W{*g\s>A{=/V*|Te1X#2v bz fZxG#^%Gil\E&+Á>5Yv"B~F/g} qqdg?>*r2?B]!=1~Ւǖ7(͗N9or<b#f9^F+S''̻rO=}a~Ӯ`<3+c"fBԊE< %lJDwČ%Br]DB˙ }a>h(*2 }RG0="@ |`zAw\'T5Nm|raa_ȏd.'Ʌ7 Vh`O`~c67h_τ@zxi`s2 2=q'[k`c{vo w)(S({6thgm3 !J;q yz,WLP >RQVQ1Q\)، "wp˯& #\׍ Ctlز2 UrFڅ/οgٳEscl fe*jO^ޓ*Z(1%Tvfgg"f#yF_s!.B!te `A0IEJ})/Ưyr~} 6JD}6GH]yPeMjni&-xCm;@.6#쁐O]S1sfb :^ɚ7Dc]]E )iIkBNEE>HUÜz6\r8fy4&YX^T@)*{6XgUFSeBwK/B3KxVBp1ΜzKG} ͩ;n(Xu= mh@i:9 (lq8=1ʃj *D:ٿՖ OY. huV}`Ӕz!JsQ jhDPBr;Fx*(osTV"7\[B̅mZ("L.(+W۴ڳ!nl~=P|w~ t6iouz8p[:(4l/V|0C?PtV>a65g_~*byh>D+ b"<.g;mE64z`xlb(QLtb'ukaFwS -BHXL] `3tP&Y.*Eq:2z h' )vA6o~ҩAaœ̕{/rTi?ZQD;fLp ;Qv}s.;:)9w}HTJrlEfCdӊKKi})`eYx^1 !݃X -)E+@%A9(w+HQ2 ^}+5BpgR@.`AGXJ xxy{\d֜ kK1Sh7yoz=z ğC r̔-Au>k`lp!DB߱ů5A"(:*AyDTeF*n!!@`kװ:@Nˣ 2w0}y L\D=yص 5Z,5,h v "ͰXP?Cd GE2r+ ONuG 8D[1>V˨>`8BhZ|K(ӷ(7 .&FLseoF,2h ,V1mzζ( @MP9 `B$PWԦp"V@ӭ8 f>}?L;8зIPz b`1=j_ِXMJr@|:m OM%KLb+7~p[qo̝(8.Ƈ F[{dxc@d!-]RX/Q<^ )iʚ A*].~'6Ւw=ELQmɘ zjj@?SN9jQk+VP Ԋz0&<,qsIpҿxȒ0')Y' 25AQDSBɯ*L89y%ݍܕu}Zp>*'7w;!ϑd-\eA[/r{hm2AKoR_)53sm^.`٧\갂t* D+JftF}r0[}%^k- );g4G:?cyJFT YEn2R{dX3/rˁ""H+ďp|&OB~Of~NEd/> 8bVY-഼-S؂3<*ЇƢ, v1Tr:s) 飬xͺ"Z_fքҳL먾}PxMoU zyz>D|Q)4Likݐ{/<$amF|*"d} C9&@͹YbRp"9i(i,M*q@"yА~#2 r@ЀXnRPN%dγ7)K%Cl\&wHB n$9]g1-$ N`/=0 T&xU,C7Z( b;@6~<)m<(ǵ'W@ j8 "*u|}ae*y} 6|J6WA'6@+Tb닟%ԖD|ܐMp 1B_-+Qj94 t^"iC;gR*:7dhUP~|{ݩWåw lu c0u1$Ȭw{Bk *+ {߮6Xs:׭B {A-tg xM1@/n#:SՈ[(+V !x»c= d8iiy˘/@h@,(S6jg8D2MR7A"?#8bQO[gOS-mA9-)'p[)W܌w9[H7l"M!0IHmt+vWAn憜 ]cQ1v Q9ds}!eHT-ɲܰ7bRoCаe}6hTu u=.9Y^:Ner3 $Иe""  {dՙ`Ss_+sAɐ!<_\JKͪ +2c'u&;3; X )cS n[gJZ\:H@4G9 Q#B0&]]{47̈5L(D h\PGX %UY Pg8(3R_;-#dPAڕd%ܐ.`i\>P@[QZc*1ALk,,\;a~4(# {Pq<#5S.z>A )J}ZSV\ P&y[̳gk!S2q$'4ZPp d$h(;eWB3~T;7WeJA{@[@&,?ҀQ`ng A9c*[+a<̊Qef#'pDs~ H py @QQChE`-ڈbchI*`ʳʢ= `ܤ)%I(!A?mGor$čC (%+bC1 X]@UZ1,l-lOa6 yp UÏٺ@vno] Q'׎⸚!/BAċt5;Ȓj*UPIQ $ Ɗy;0=!2PhDȯ&wf+ |(΋~˕ z+[ bό@(C!b%Ueִm - !O%pS{G#2L]kw_S-`K^'80ց{Xd\=[ZUdA^Y29W3sLÍ݀@yb̾,4Z `!,/fu7-u}FI:QMUt>J#GYP,]Mr']@T'IBE],9 D|b +Tde~偪@m~Q R$VtMfMPm09QTVYT g1m hw7d{ڛ?@`_oh| օSmf }NT~ȥa鶡 7߀4N9|.?SZ!gY , ::%=OJWDW( r# P K GMU#6Hw(vLf\ lQV2Gɕya$|Zx%dbdŻfCކrQ=@LsY? WғM|3wT+xjn[$󥌖xkxDKP)C_b8(r}$?XFϠ5wͽ-PNSli5m'!r + !J&(%cm&3 H3h_q4z;E.ٌ)>;: n4T GY_$ Xp@h$I`v6MϨ̧СLJgrW^ckn㫟YF2Zʋ")X^+򲡣W*ıV 3wn̎pK_qؑ\gObWR;\ bẃ| w (p0_h:.jF` `X6YO98/ Ͷ#AdUDD%eܿ]f>Y0e19Ath)3dyE$ 5rTOZW.5A\ q2qlgTu P Q|rȣ\YB'/ǎh˯|nW ٔpJ5#^զ dxmVmYWdbLWpO̞k}=},FsI>w)K{JtPKfr &(IƯ$5(J̖AY_l@:8 9htc|"K];jXPz;# : OxO7k6LW[`KaGZ_eH\qmD!盂 #X#oB I%P5a06G LBfq7lpb[.U[VuT< : Bp$on`Lp;h*0z+G V̐;x (H kfu'HIVʓW #_li|3"Z߰~QGS$WÀ_FQ`q"Sˍ=~l17TհƠ}Ԉlީj-п`m- ߁+-[\h+elor3'8H#oȓC ظ ,iׯ&1dH=\݂?k,SiJy֏eN0@0Tw4p@0C^+r[埠P>)J{NpؿQo锖À<D1tV<oľLg0_n ~>ǁD '/~S"4 2Ѳ-a~| 7ZDOCBjk3{kcTb2B7e,rmϿϥ#=l؆zB؄›ÍcCE38G_%=3,tx<X[7Wc'v׵G &*)r1_ )nk>LP87Z TEAIp5ȝXR nm]d5=2H\&e l8K@EQ$L|}2 qFUg@YDmpT?AEi`&y D&& Ricna!3VvMr^"A\@&Q SH~* vɃ ˵>lrh@m@``Qb?Z/'G ? O̵؋8%[aYM0 E(yW "rx8Q;%#1_ܗqk Oh 3^*!0Z䇠6_ӦYmvxwpBVčZfTZ80s/gj1@TR- raTzX̒I 7{+[ xVFLAL' y /"xGsUyّ&ς𣹝8O{'bHѶ|12 S_ ʘ (%NUޫ@q` >rl ԥx sCNz5Upmi{j1 ? adQ9!JҘj 7@-*'pLz10?<`|| Br< eXy*Ub|YyZgr vsvA^ %z c!籠A{Վj |wA9`&@2a f"===ҁL(js F-4 ;-k. KX^yne?7Ǎ~ 2Bĺ_CFt-t[2wI/ |@䩳AR#zd/ϤAh6XRWA[%٪AP#%aE)a[c|kWn*hMU0ޓIus)L3{{UQM8Py[;Ƥ Ҕ4zߧ-؇ZokNp^#¼fĂ\!7f_3P26Sk?#I%Oq@^D#RPR]!0ۜ_C!T{K%wʤ! pEV|R{'K.(b_·DQLE2tA8l&"-"RY J]O=_oc`3"bSA/ٺė28_] ފˇ!]>E^ |o3H&m}m7 $!?ϟI'{r0)I0QVFX Q PѪjWx YLk NqWEe+ G .B%nK/qjPxrKeO<8r+T=CAgǻ^[Wǐ3!hZ0ǔX< =Vn!4Cyȃ:w+vV:tyF]U F%5ƚ IaK+1?=srX*q:8+ ,N QљǢȥ3u {A罔"}/KV"-!вm-VTFO@*{\Ed-} g !0dz+А R_ݼ $0 |$O ё N 1 S#@; LNp' )Tw 5R>x耈=9#sYO,"} Wlhǀi_ T5!sp\Oe/x \B"R^/!}0{ 5x4,C(PZWe~CCQR' !d^GD^ɵށ^=ˇ@gr K43{A4 M/ ֋R|لgfXj!@ptIJ,0~T)#r5=ﮄmŠ.S@9U}إ8l;QJ2^RB-cm˔ p^T@U#+Ir3Ȏr!;'-))ƅdc%Dqurv?L jiw!c}ч5@H-"r<* ڒlwX`6|`\vp:Dln%\SXSHH6c` g9YPߺeObQOa <=Y aAza|蚑Y@Z* (Gl3;AG➒A?*o>KJdr*E8"OyL4ox@xA:.>^V~UvqZu%@a*1n<Y .J7v???2Ŕ);P.rh 4q8I.u`&D3DK(T0=QbÀUdVrO^ LwЃmV 8lvJ'*P1Qup7P&͂hg!#0ϊ{/Zӹx}нjw\ lJd(J28|TP>P@>G߁N- 149z5s).Zj7 ۲{g.B%;C7{W)E)D*Ud5Zp SCzh x^QpHё <DjMH3Wް`2be G)'~ PZFB2owPpP)=A\EY׷ٻ?=88P9`6݆^j>07b;@Qd=g~ԤKȕ-bEƭвrXU`3 "<~ FyGs$7SAΠ|D }E;x&+>Xrλ?[» ouMPT>PWKU:XVh (ݧ|y 胍z,d4"rr*e/@/GBh)2aQ!ύ ȯS ќQZ/;xY<E9)Cu~ D'BKD>Z#ӏ?Ƀ"5K=X,=c0IaV:XQ[E) 5$[ȕop uU8>-m- 3`;Ce{=Hbx4Y']xD+4V;y X!C/VLؒ|d-ax[Αv'hJ;@8*ZO9R5^y=kHX%0H,H2CowʹdGRo=o ߇xr~dU 5%R r$斬##=l/ 9 Ls rYh1 NlJ %Pű􋢨KTt `t ʯem5Y `4.VxB'BODv  .1P/c(KC=6NBV1`s00WV*C󄾕:(ɖKC,UCC"6ͮFG[+؋%WwLs@"%߄VsDoY~>cGF^ {ɼ k%+JX#zAҹb/.3">M(= r.Ԉ!M =#M f)z\b<@ƊOpK,2?dhG*g9,dv+I @nA>5>ǀ2@[qV`m[`5Xhk 0w3D;-%Ady{PoyB 4%@'{ ~6h])i |66r Զ['!nem ʪNc-5d_#XCsirHTPAr+o<tӭS%c&u-Ctod-V2GXs9 .ub,TN3%kb1Dl`} ߔ۞Y;',}6TFkЈ n)n(U5#Y̟*u)ݱ?SDY^ Tghr(c DM<4D>{ ;-1l9Sa2hu?`}ժ/ZNQWU1$+spbI`ZR\ac}~)>&e{M ]8!7cvCy .;`o.P~brӌj 3|i+FQ=2^/o@^[쪭%6y;+ !sD>zzɃR^щq@@TQ8cDi1΀g@o)nIP1=[֏Pٳ“qTO!tP<'p9^'EU""plzHֶ==t=zKUVUw;V%m4dM=)+`щ@5D@5D^ D"@(f{E͌u!k0XÆeH -v@*KYcuGƃK~σ`Л2 2k/} CduzVXcC; tI맡U{fdH}=AjN 4?xŎj UVR:M+!c t t𒼬;"MyF\Jt2)*pWpWH^<)B  @lUJ,X '7[CV Fdފr!NŃ@}e B4ן@F,K&| #m]?PëFW 3t+ o 1.p'G jH-c/ :"lYwmoL%C,逍E#$ۼK(dWJj#lL&?PT S[.`ZWWA@:(zv5]S69 _7BޖW׮V^E m3lp"0| ^tOݘbWKhYl_7W#2 z\@^  5gur'=Çtp' ̗}gbʮDɢhe(Z e+V!FFqO !sQ](Jɽ%9)~v`tr2@ d䄧m7>q0{.s;jm(aXHyFM8@OBj^jej5\k oC״TY[2_!>W!`o(RJW@:E5$Q,`1~~ {A oT ׂM} J++a@r?>mZhvs? ֹ q+Vkt9[n6 _e_YGjZ'wela 8Bc‰+(D 4!")*mSNPI9; n3p%Ҕ:Dsz . ^xӌ`)B^*OHj=MKPVH`| gu jp;Ж};m7{/ `w}nlk@G 29 ֫as` 7Y[Two eh\FZ MmTOqzNh`{C;&CRQ/|8K s )x[u#ݑR;-0k6Oct&sy_l㜯 qvN2 _}e2\etW76mZg+n>ٔ.ՓMހsgDg*|M>LةզXw@#i ?xQ\Z{۪C{!ШxR7}` f6q^q΁!- @0~P#CC~-{ wfW0Dӂ}yJx)"H-PQdw#"%q&^i*E/!  B ɣ@‡;_es;<g6[@ >p_EcJ{(3"W p<;6sY}=πst&X=tʺ;`r]:B)Wijc"cpJ'E՚~,>G_\b~E F98K" 8M kG8VwI/g\"lWT+_uY\BISꓑbo@Hwf kdt䆑;㟇J8PRf6Ps23s vtPTZ(ڍ(Hc=Nȸp ބ Dӟnump'zFuZAd=vǒ27g@ [̓VO.ipM[IDAv*@%N.8H3L(rȠ9[@:DwvA*UT Ãnߪ!=;op Lind@xH ]m\qǀXnxA{)mjrbz={<=Aå>gga`S8*Žs*Bw1;chb t':z} ! TqZf5 !l{EGF| bɗ#YA仉8$z,悵׳OyQT,МϹj+ޱi]s-N\rz9?CՐ_]K踿"Dw7ʁyF$z<#1`>2s z.q4$Yd<K! BƺB*#H v$5dlJ@. ata|*L,t %Y^ 24AFU$7[xׂnZ7 V% WB.KvxU Fi=`b@v-ELwmxɼl|aA" * @&E׍0P&!]נ0q'IF^e/+o>̺b겪Pq}uprv} kr1p 9ZFTR(MCJYz'@:3_noN?/lkUmjι$E!er > ^JTe(kx)W>_j??ee[]x4_=FЇ:pd4?&[Q#@EDnGP8R%z^qK5 xҙ\`.4meM`Sle$ T qTSXwąⅱ8"OwPAsH֟\\#N0^ 8.*O'vF!5OPk?#ykr2 : , ӭTrJ7@s<әod!PZG p+ a|&A.΁b <) g&AhNKXOVsl+8S3z[ѐsn87D26t0VH}Qq +߁c4xE:;r]d!пR\ݫ!P jo$+$ ׊8̀Ғ29g};ws:[j 2 pgm@p ' kXi-. Ot7z'_X{=2oJчCAto`/'8Fg  XTPH'~0" ~* BA#!`W4HO8B=G!;ew:nT5 \Fgu5Wm jGo  ߂\3o뾈DbП.:sqjb _o8qڀbI},Lzg;@f0@2gSEP06u()9 ^QF~d>pBHtF JL{U= E{3M!α]Yޖ>}0H$ 4o. T"p>UR̒?'@ `& 0C ,ԂrA#.ٖ->w[_!͉~? 'ѷX M;4`3 <'I.*ˈӁ uq |'ph>ӉLR` 4--zǧÊ?\ lcOyKk@ jqpJ6.#]ZRAP02x/9T~ϏvmvsaI\$ᘀ$K!P,BPLד T>Gq-Q??SE`;}uxAyld,K5¶Pẓ]>L9d>eo (I ̯ p*c$ڲ Gt)!@^qʚwC?5T&rRVAȞԄ=.gHom_İ8FWgqAwүU\)w|p \u3e<3+:yV^'D9T;*Sy<攇嫽;L1cg)`9upOz WhY]q]\ "2fRs: Vq γgEhMRWV>3t< F/TtkL-ptJm_bkwx}Wp8!`Lhd9>#t [8 "O 1@'l*B~}'eG f+8cuƬb!ԙ$+4K? m ױSNMWZn,$W҄@qi$^ց؋!W< 12'$d 5;g7+qI^$0Ge@d0@ss?٣l|56`gmHqS!71 7^3ѽ95 I p=JhF<8Zhro2R"Yz#h1/35(خm@>R/ v*f?ބ]@ _@66&}5~5|E~2v{ni vUgYxUVH9<qd*`wf<U!S@$.,q08Hd١H?e)-Ny| ڂy=+(@B 4a'H@6 fEc> #yq*QT$bK{fIܐ7ZJ 85e4ׁ+@9yz2DLX|&\ynTaj0ؽ[azLȜ|g\3'ȹէ<;< Crf.k'৩Ƃ<'I1q/|rhLrH't~ @:Dc@=9<9'/8˝}5(`m 3eRKMnRG$ҋF b ֞6DB ߊu"lkdA>v̊Ը eAY9bt5Xp@g736MC0{1gC8.ys.Y~qZ3n] p]g!vPX rH:@i`k9Ff5\!`OcO- Zh=X)>3  nszBx'6&XÌ0i@2k>#<|̀^=޳jf[d%͇|@Dv%MC:+*eawH i3$\ݳcvi?WGv* 1zJ?uwm_fi`1Z%^AίE\?_xc:J0ߕJAәndyJJ@hQo<[ywnʁ ֌#@)|`1޾SWhgq΁Uf 7@ݥ<8=nW*:=C+sr`΋^`0>?x ;iޱ4}~QU=PF9d*Mk6h@'[3,qoeeQp1n[tApBPA?b!$,_5UM{p:ZM'i"'hq?dԝ8Cg?Z $'3"iY[԰F) J0j&J!@!)S0"%q,К$\nr)6% G[KM@w9UU[ `칦s$K7C.}: }ҕ oЋaK@$0z5\"x._8+ 0A`ElWp 9^ e6oSs6ILx3_m’kC`CR 7#ąY LԱ@(A׳ZFu @:t2yRQdr5w^I6ƆW1oϨU'O 杤@n՛l>(X5%ިq zgAFQOJygI EB`8XB:J/`$eT7HEb_F#(j},U rB ߕG+‹vңW)W7_N$]8tAB8Oe :]E'[~pD CR yQ}-C&~ !\& t pqiaCoA8x6/FO g=WT]2 y!gJhs:iy wW1I5LX=rFc4`bC B. JsBM2S8Ăi hF ÁDJ> fqd1$48d˃e\ ~K'~&._s Hk΀zp@4/ Ra]pgx>`[syP[=cULe NN ye ^75< rq|fd*ځR0ۘՌU?E]p|8Z!z}KtɵAbsvC̍.0 pYRX@K|vԺqY0ڋ˚KƢdaXRbdD| $Ffw 0wrVԐq!G{@[SAh"P] =8=&2p eAfIM %WA#4pZknz{3Gp\h `} Ǔ?nɾ S+I囁6+8& S#nܸ0 =h6HSd/:˫ɇelow!ÃX76l_bp>; ]e2Оmd5O6QjI6u(K<90X+Z\r. mn&9_a@^`#qHMiE,,|#Y!UvTwPZ~i#Ԡet'Cq`H,J$CPoB|0u|VcI3:uX{ovԸ0 ;r?pF,!|2< ֑\T=lԏɔ $I@vZYgxÇ: qCvlj{pGʉ:~u -epwrO.zM D? (~ss] o5 eޭ~8c%-oUg DG^LQxVШ PLY`2G`i˱ 6܁ʾ9ϸsNσ!^>DkȫQ˳TB^bGAOii* tl.EETQ`,x bwGitReC捌*eδw$J 1ڨ,#A/8u7J]C IIW(= RE?ɖ\ ^`S{Q֯` _p\j?U)B3'*PKFj`8RP_1]$NyE9e"yNCU&ûmi\!:RÔtw/Aۇ7}-|ix A]YVP FJ]x"8 R|;Tug:em)Y dslЗ5DRh@b$R٫8w.C<ۚ$޶'jpU˰8D-L7@&n#Ve(/;Ua D~ \qx^>&􏰳fEFA`ǁRUzK2Av>[;0N7H2?଴W 0߰!hT/G8E EzK{KmZ9MG, *Z=Xgk&X\o/ rϵ.;-~| E 8 iK;L(P^T*'eh/-u'H& HB&($" y|K8L`M8> Ǩ)!Vz1_arjuF9DL- g/en ;np0?֢8?er> 4x&Ul.>D= <j+ &@e9. l3E99NP簶ȹ| r̕[r|,Q:.3ߠT"Jr  ܥPz1j!p/ep sh+sAgqi$E6idI!/rvv}3X*oW 䰫>i 81`72cMȏPq̔ kqv vqQ1-$`~(]eb&!@CTNSܴ]8l2n'vfcY]{8'`<%_}ErKe44Oە;u>G_'%@.~:f]p2{C/Bf WqCn9=_vu\"ߣyfӖm>]Ѭ?F7|3^ _ҸL`ltZ.6!{Gpq/ kyg'v,; ^{ (g܍ l殟1~Գ^Zع2ƛ]ihw4#ЎsAt'Dq|T:vHK9ѰY0g'y= "${H=BzMse^oZa8FmEi!'@R G:xB5hܯU$ -i<Eyܒ2iG벫(ύ1q|>)bbNLQs4m,>9ԍ&uY 9z=q7Cw緃wކ9)[ rZB`h椆 hޏ vpՔ'A'CNEpސ";V'pRԱ3ҩMC.4 2+_XHnr N]!JiRe\3yC4 <.D2Qjc7`\ ]lZt/+^0;;/;w7Qiir @k`ϰ?p3Bc NqD^pNPb;a5̖u;{y/hg NSF:;o^{׽Nt7X+ 93@0ɷ$z`Ai`mZ`>_ @~qvk3c=A13wSR}~eBRb.Ԝ~W+i{uO#O b|ヂEcM!ۈPO>[TƗ)eޗdL![PPwQk i ._9H02%ck}Ysr2Pc8/Hv߂NukM`^;=tAbs! SxٹOee:h{}$<ٺf&ӝÙ:p;Ez bfC͏|]?ͶSoiߵ|%R̓TZo뻀HƯ_ syBe M@X@6>JB~s$")@WT/#9dP}WrG)3L<205 H"L@u ѱCQVpb:zºos|ZɁZsm }'\_K>1? g'YW e>#,c-sA ${ k\𯵟5m̏FѢ0 ȡ\nw6RS1M UC`3Kj,J4l" <&;@4Ӏ6ܑa/8I6Y 8&Y_WR[kG3-ኊ{\)u>\-y+ :}٬ P;xahKdOY@/$rQervAp&->{j{icpOAIg2 ~EMp?.B&,* ޯ›~u >x½ 0~#3ƦCD+Kl IEdnK8J?R@@`h\ XO,5kw.` "!u{_H6x9Rs;܍2G`8Ǽ*~ aR3Tz}Uy<l:r Nyn.Z) KG<ѠJ(C4 pLx*}RR%Q9F3ҝ 'tlx@,jƂ ນˎ WYkؿKgzIb3`Z\1u8CXu!B>`/`LL!, R6.d]?ͮ_\p0?Bi WhXbpr1KF{ L&O9xt38y7S@7u%릃b]xpםg!t[aW t{-Q:m2L`wu'} F}dLo;] l8U#tiFU+F bv / Z^?ՕiRRҤ1nuH?G$p@C <,5$UxKOqQ@ާM@kI`=1 VAuY \'B{@RE.>fLcI990'9̥ 8O!Дd` tnG K%+/R9˂7pmz;R8/kQniM + $;htw+8r<ǜf[YpoN;|!+':SΨ+@/zɺl\$$46 @N yK{%*kޓ(Ъ|@L@a(U9:S8V,9HM.H1plbZ ^uI P8I{@ȗdNΠsĀ m8KF,hC9ǀ!=WQrlyrn=2=I..1@zdN4D D !H(IA9#C9"p&bD1 (~RuY#٢iFk:Iֽׁ+b0o GS8n' K.8Bv.7uhs+J>J&P\{u05up yȦPy|(EdQ5_zi䝷 e[[x쎰cWHSI (UAsVOPi9)SDwur@'y6]y @!.ҡxpn&%Ϲo/72Bq;bJq5H$CY@z#U)) ZXxy7t;,̿Ex D!4y pU<H€X K> B 4םj @QALLG S%tHku^g.t%A`) 8b*1S5-茐7-CW1ybZ%I3}{d= _ @Zr%e>W3nOA͙qh ώlpGyT6Ǐymi1Fx72}:ӂ@h w|S_灔LY-Tq*9.u 9G!jO3]-L>3/A :ب'@W0ەyW@Fx 2 >;:\g^Vg 8"X!|"+k0KsEw4bnG] Vm9 Ethk%vEl51yO$ +R OMҥ Y" HčApP ǝ*16&sH_-"p-q|] ԕg ۿ mIT u .m@5=oA3!橬7H}(M/uNr4Z2HK6@<ek@jG&ۀ;R "I q$d ,'_+SWLo n0ȫFy>h}PF I1F`ὲ&VYnQ!b ]74vc+pݸ@z xAUv5H*A$ pS2DQ88 G>\iSt^R`\e9 tI|&XZHXdWi]rz=) UX+4\T*T: Znޯ5(WSMHZ4i.%w>b&AC9#e5c,PRM:vl{+6̳,@470C9:X|pXrfz?W).G( 7$s@&/5ѫ@n"tpW'!@[yh\.jx%u!偲4xCfsbk I>eջ9A =IO"o ^.f:&?Vt 䆬c X\9 "v2sMl]s}qVBjG?(89CthsS`tR95w7oBN­L 1^ YCxH>@3 _X ) 9#nQri GE/si k=Se^|:B`/Ї K;nOUI]BfNH=imxr<;ȸ ]1OBU(sb#`GB޹2WBQON+ fUZ8@ "g3 f@ADˆԄVr\Uc/Ak)3vr@gcDUX8 :'9wZi|n?F6y@I`T!FC*e! 9i T<$9/h4h\scgOss(XkpPx3v57A}hRGn_2IAQFgnu=+ VE'י ?͚5#ǁ%mns%O lc*}(|5w(K033 FcuCn=,MyA:Jt9.xS`P%oxgp\|lx#hS1pU(MFkKɺ0Rh7y 4ڻ3@:U`*8/ɳv&Є٥+/A޼'ڳ?ܿ"\fמF]d<4 && oP; O7 8 '+ш*U1|ER@- :u)GЇ{ : w,e'h7fhO=ʃAZg.ot(QEG `/WIȢd'S@ZQ * @K CuJR]Y@VdD4 w-Q0?A`G :5.s, I2Yaw<]V6Dda4:Y 0;ϝ_u8;uzjĨ.3UpvgoOf<ő_ !!|bHCPa :u}B=AA:wnȝ yK`Ws pN*-Ev34g r/UH1酰l?a_ ֶk$~⾈8*|W C귯zY-F`ᛳ;CڋPd:b{y*?!} na] B=fOVFE׵zYq~Z@]zR %R D}Ul:e20yKyF6tZKy]gAkK@W[ >'k.a\!dsA B:_aйKX^"W+H=XiR=Rg!DԓvY<͙ dMaOEwVA \)A޺+Psr3W6Fvd-+fwe]7w6sڗ: Qi+BF[,. fZ8$j4ﺗBX\6K.Ė @TnCg'kop' M4>S7SuƷN_2ed]wj,rH=yT:Hӭi#@4AOK.R҂T#Xn>E9k؎<d\x%$0?Z?Pu&mrUpptt݂+h-,g<㬌3jC.E |!#dhmm1@T2F>݃]'A2 `wv806{ρqȘ FY2ZBĂ6aPp:wj{@gZAѯI{0ZG#9.WXipz Yu.|Kӂ v=X@Ѓw44AL˓c]ȶ<0:ߚ=RhS} ƕiokxny ]ow׃-O:7eS#Wk9l !n N7Hw~wfq/ȃphL+*yg^$G@PFb@op\` 3v/IQ+4h:]:=A2,c0DZgK{^cDF`h YX` PT Ї6T"JuvЭZWǁVQ,p\3MƁ*%»z]T7<]}Dd0ȑjՓAW~aH/vI)[,$&D X4HuM5LV@Ae]'@gJt6)!$9z&$')tї9t;#U*e '.=\%Q8{&AFtI-%4 줥f, 债=ItyT SNAcY旁O4>X)Yk- a0Bڢsd;rJ.%s@\tq* h-y;yMi ׁMXG=0@ku)TSҐ?WH UZ ҹ;YCN< vϳ=`OAj́< 7w|L(fds\,9T4T,4['.k*sKo# ne*w" Uӭ qYr,TM -C'TI պ3m~ 2X&PRŊェI<@!ŌŚQLmqNp\O[6 R$6"UH&pzMnG6@ml=znt/g3ܳ3/]x~6sׁ5O nx Xgӹ@6єh Vg;!OWU *4/j vI?|!ښAUhw0,BxTpf׫:<\f`͎5d}\)F}L zAdc4^A/xƻ/[ط#fi }C~]5?gc̟jX2}MY#4a "[N|_} N3Gk*maQ 8g&u EM5E.h %IqﬗK u̅)3X?-!FDgOi?ʽ`f,в o!L#P^ (58N?0C[8W|Aku6Xs͝1%v2SF;Ѿ9pڿNp?|t/p!4ri]W4@N+%|V<`37pV:u ;;ĚNLѽPrw6Xo;ZkIS"8 'JJ!ܡMЫҖw&=FLͣEޡh#9M! qEU"C<,,4Du6}*kҚX:[i  Up ^mōƵȂQo&п~yϴSH.N[` Fꯠ;nAL@4b P(K /m=A#""t=vn<*)Iq3"01xrsYI$IY$=VWCGin)Gx+weF,>; 0c+@i8Myp;qNT)B{}z 6 t&/Are mըelZ`9םoA!yr༤wF5'veg @uПt~\_U>H:+Y,hh/e8Y A/ N pz6!{^o5Y1 ̯5 Hb@[iT|^L>@"`5l9v7{,) wf$QK⍋}N=0r83m1#9]PW܏zS!p<E}K%Z`ŀu8 K烥jg5wFp99yph7}|WpN* <1@FGR~ ܇  kvurµ<︟kÙ-^|5t ?6?I 'yEpfdQ/(RP@S$[l4VΒ8à.OfK%tV+khCi/@_N&'$򺖌-LU{i]rR| ,/uKݿ!OՀG`K'"9uk? :F>*\_qXg[9Q~?p Kֽ\$bqW& M&@SQ +a$b r^jdQ H+n4*Ly. \}[ )n#K H/Iy@6Nũ?-οMaxJw!뻺2~c/8Wk{{4 {!X $ !wwu{Ŝ9L2ߗݵZW]ݫԦ4yAh'# &(L/J?Ξc=uu`I,NEڒ^3@W;u@HU?Ҡ(UCȠ+"G2c=}^~W'o7$sk̪ i 6(6ԉ5܂,˴ s{\1? c {V{=*?HGO%`?~*QD*!aرk` ИZB` 'ВυF>ۀ, A RU8VnhI|zgo4_C ֦BA")l?*uʑŘҿRB{>~42AG '9B]"Hc(DuGP3Bec.Vs NjL`+TpSn`,@SSySzHU?r6UZ6~t?S ;+\KЋ9)YTo6?(CkJ];n>{F*.xQ勁k1P+!*~/d.Țz6)S Bh );'&-fI^ƗIƻA7I˒;@ri%w޿?0<\O\@_݁x$nJRsHo )%\mqn?;)ÅA{\| $.{6zC $̉?2du2im!bbR Hz0.3xz~!mpmH*L[]}w2dsqd_ _YxMN{ă2V{J{'k$ҾJ6u*}W0i~$M7!yRW ^O{ /X+Hqu}g;%z~}r!J|\R=q9庸7A/ZʂR loBpQt2if=Hy9p uuCD)eQЄ0ȬBW悼[,A  ILǼ<^CZ*홞`T}?__|1R]+)Ӯd浦%yWt\/ yY;S2Ecm#'<q <``BlMQo윥ׂirB7*o?[^rS)x2$0D{L-{u}HKԗ<`َBCHTHxQ҇O$%%Mi2 IEA W(@f v|G/,lIjْ Ϥ7{[2~#Tm`C塞c9<݇o!Tڵo P[ݦy3+"SOgo'ڛ1 yB V",om>ʃi,,c+ { I`U5%XcziBiqc%݃suȗ]l , Il@|#m ^΄[r)tfxg5߳Oߗk|k/Ԑtͷ lr[n^/ar&k<\3Bܤ-A>n Ť8ǛUCѿBب"NZ 2,/6e$M䆐E,J.>G[m4M> 9gYYrQq@K6F1'z,Bꬴg![kb/B,gO iiӶGhm WJwv7><ﴋS4`b9 uyĠ!_;ۂ&`󄾐jNoCŃѐnΌrYa۠;7O={LMQ#BʷeʁdQδKQ*(^n4!zeCt޿=w!(((((((Old+(((((((Old+(((((((Old+(((((((Old+(((((((Old+(((((((Old+(((((((Old+(((((((OldR՜9Kp}ݥ޳`/x#ݝ=Ob_$wpAAԩjodL(9}GMoV!8x8l;q L?TGX7 F~@CxQO ޯOq5C'f>| _w7X6?txi{E#pE{-H5C{ c6x Vs?3= Ք*q76;MU!͛<E tl n6 45Qs+uJ*F^ ;t%XlLxI=Oj \7w= llGnx;X] YZmBޣUy[: }oe(\L>>tG''yW wQ Qr x+^hRFMѐk=)!86j=c眀q?#ȼ^*N/(_zG ێ$Fm.!Vg:WTnѸ ݕjIk\,wApU1p|nٖ>oR_H|lPM+)M\Z'NZp/q4musvwdhoc |wͣz'z]nBO)-߀=rK(J.x0y gg}W# o܃KKs?/ pb_K_UF`=`)uh@ ¦~~ ێH?~aDDx}-R%N Ny;f-!0HiB44.d^9 !ǧp{eE{/n!^x]H/988κ60lEƾť\Yn<~0jCjǔ'w>P--CһAqzOk w_9t"x*XSfׁ zY B+=^;W)W5jhr#wupQW/À .LtzQSONjRNNi{%]-u /.$jGw7:=zY:"0y΀.WV'3wg[{v3inSDȪ1Xv_u~c= u1X Մ%`>?sn]x%b!_6XA˯ϼ^Cx{eٷWAEP=C5C-wЀr_Ler}_ZwQow SW`9'+wvU^ufC0I7HHw6An]xM/4\Nfi03rw><7]6M7zIc`RFM'G pLg&;Ho#``?#{A(׆@w@ͭ+{N}cj4}9/?q=[K1t*\KYFRqKX҄ ڥb=f0cnj!|o#w*=料}P| wsr׹0rs\:2e u` <s%W1q.8ZCz,)fSeG3ny4o'fj]}ϑp `UC9^{e`ZM6Cii@4Z^~6g0:3}g񯓼3aRSt30u=N9SCW@B>g'u{r<g0#Nͮ#Dž{je06KKVگu2}5ZFAj=c1T~s̱oM3 !0CSPF2l9?߲ȵm6uɪ 0\VO%x;g:BUo)zsހ+}CnGc aJRZxY{tOD;?΁,{A^ ɺFGa luP0AfcIH ^}7a ^% uY1Ȯqr(F1\ =i&9jfJh(xӰ?**\W6FXJ{P޷O3^eUO%3ñG%auzPϋ_" m6|>YoYs+͟\x1m,)EQOv1?)G=Ȗ_6 \)~.ԞlYJ4% n]pcTZZEhg:J76QSSl8bw|=O{$xI<,fBXfrj7*Iᦊyc :m0~ I&1o ^s/aYw*-SX6ғ~NH'@j 5A)(3T)L'{l @q{s;W[WlvQf\2gރ- *kT6 V|6*T6QGMޙoߏgy~rOYyk D. nE*(#whHϖ+mb?S9WQP6|MЫvP"Y2p3r *N--Ϭ̏<2A?}+eA+5|Wv\Qr\c}ȼF 8(FQ Jb>ބkΖ.86WP`- O@4%j5 #"1Ii*MKMЯ>߭ @ yBĬȰ~ܶ폇,KCoDBxj1x[1q4CW.ЫvbB` [v\qi/ cnMVc(NoKOݢֶKo!|+ÍoS5e6~G# τ30Ⱦ3oqo_vaA(Ceʞ||;|`]9V[.m4Cͩ)C0cXMi;%I]-Y{PTe+)x&QB+ L{pToxD=g3bUQ1ט 4@FOͪ~,2upu VoF_Ɍj@L+c wYJj:Y\򃥍i3<|{s%0T=?x M`EiEYA+v)KI2MmpKD8gBML@I*[fON7&y#Sy\eϪ\8xJ`kY#J L OQPW]\ 8pz[306V?ߛV>>8z:zBj笸8`7>_;uNvOYpt:{7@6 ]lD_l02-$SBdPaz"}]7B4/0*eys<ՅBry,$sk9i=etW\ U{ܸә<`8k_o'5w tH>) >Zx}J)R.(݅_z1m&(XP|w+ovmN8wnսr; ^MYrޓԷd𚋰-g|z <LoQ+wl<@D%KNax'yAK#B^r?DX f3nq ^_hz^%LL&~o/!eKb>1I 󥮖^hL>Z!)^|8(j p΂e'=#hWΏʈUf 5>iV]ކkm aȪa3~WM%'5]<!g}ǂ 16`@mK;]k<'%`of@@K QUA Ajqc7T/AaWGk͞pɾJ.A<.5o╽2X8°vffK%]Iw'll0>oo(s'sS]AbpġG' y/Àn#Fa"\}ߣ b߾?:TW1,!XBzHݒtmSx3yen /@O4櫍w3m}Q[VW az``=}b/>K9Y2~>W2:jU5;hEZIؔՊU:=pz-7 HxI)iX.ek5JY]K5V @-*XH!nvhh0S}H:#dn.TYt#=6s97rvvvI^qhuAf;W\3JWABGd:-wV^M @ B^*Kn /&;={EmbkS^)ogN)OG0|pC{ +8M~ E|h)38~Vc\~6PGٌEw8`כt&\:q!۫C.;+9U ro68SԜ aY%]ٲ'1F$6qZ40 APւ j~m-l tɻ#ZoU )^1,,9߽E+`20AjCV j:%,$&v,ݶOCDQs8K(o<j5pAW>9B%|`]vB1ɀ x ށ}<'c1/\'}۪78Y! ֏@kEL ]bn`,UVA{M{M%ǃ^{@s8b Gg3` 80 77'XM m_NQb(,$QX({ߋrγr,D0IhB n RLFƃӆIۡ Z_h}hP,"A:!㇏= &J\R?q'< y5ge]6p~9pyv>58~#}]_%NMP_{m ujۚ.&AݤNU ^Q7hvɑaI΂?b7H&4~F8B$K|W 0ŌI@ @l)8I\(u3N\\ s up{xINpw2kJֶ(l7$/e2 uezρF~ wWBHGPfp_uAQc\臐Z*ԗ!Fx=9F>Z!/5, 7.=?vYנʍ˖)V⎔5+yV] yaƙ{[.ݾ=J`jHj)?D}8\+ܮ}QX]$pftģyvtFsKn\QF !MSo4 k 1W4J+ NڒIcR+B#R%M ͆w Ochj !EE ciRo[-v{^'X˂Ri4LJzoBFg^dI͟oS>ׇ9o/B ([HHGp.H`Y7 )wWv(\P<wD $#zhմk@ 8s7Ih't մ} apR5uفx0u4sRԖ`z zV#`S}Q\H'hR5<_լIqaʼnm}>c S]Q?!˗Z& Ĉ3yv&wDCXv6yo,׳|a/{CK}I&ئ;[ @x'ze)fZ-$3TjR  Aϡgc ;^E[ŭ`.s8٬6+d ]@@>Z*k Ok 42 u;Ņ_x)uIϸ pDf0m7X:*5ƧYY \}{Z7 t" \9@o,3ƀ<+ Lߤw7[ȟ& I(9;z(LaV{. kSf۬g~`p;ﭬ{ƙko~΃ KtJ)=)*9Lw, )S7؝v&wy|[No,<6cp~U ^BLOi(rh|M^rm'OfL2Fa KwF›oj\ls:d\蜹 ı4q$Zl-T류G`&&HJ6뜷 +Oh )u܂VzF"!˜i&Yjj si ۡ@Gˏ=6XxqP/ % eXPTL7(>qp,Z 4ɚ nn)<{ސ'`ͤWރ'5`\$L/ylw8QlУ dxB6d?\TjoL= %dAk>־Y AJ {D6@T#?ւײʚZscc8= ayթү '>ϫD;Wf_Q~T&우ZQl[D6q|_;!b}c"gAHp "Yc 5 2K PV; F004p̷9 ށ53k,XKߐ{sFC$?WBMB9];v]wA+-"x},E !:ooXf>|т6`g4gxeooXST#q8]Vt#@$$zS͏pў'[\o2>]HHkCo &Жpuׅ9ށ}֧m- x&J0d 28WLLMm!j|H>bv~^c`WmjX.>Ur^1XS-X\PƐwݵ-^s7szނ靹>'03M}P-߆7֮Y=]'jQ]Wٔ4Ճ/a[ZaӶEVLsy̸ S |/ldx8Vλ?ChOqHa¯@RgD6#|[}[A?~~ 0&S|!oWWbXЪZZrtB0MTXV, zE=X5e ^(Fpo$8YAg)ܕ#ox!vSh%`lByclr['"ln=AN>oh`8ba()A!x{ ?_5p^w9m7<RR 1)uO΄sJ:Arc)K@.+"!˔iҷ o+vg&{F¥"O_ {wkHi4u;c7ăq(n,}& 4] Nz0̝boV!/zZ3H3^4ioe`{mH>`t!B*8@:@br ۅ- [9w [W1twr|' V;@xkw(8c_o5cοi0`r D7|~8/gt2AX ~b^ֶ <:T&=2(}3>-,Y<د`ޔEg7 9j$KbiISǃ/bϯWV=Ur&YͫU!/#!Oy)r?/Ntv vi+ w<@Ai`,ׇ ytK0 橁`x̗ { mw`%W k#2Jå'Fy c1&L ?*}եwF.ۛ ^ɝ|Z1ΐU`y[y`}7VΗL+L2nL q@8k'K L}G?=#>G]t~2)yܠT|Y<":J KqǖRAl!KX & AB HǤ J  1@QQWJ}f0fB B3*,: ό`<HdA`jz@!0As%*B:x)*^5B]0d-0NDă6 \*RiWuH|+ S?a m!ݑbI[\r7hi5 D}ͽAYZ:a/S$&}^sy6_M6E>I@oAi+2H\ebZqP[+uzho!zm"B?1kK̤[bWmV5_z y8kKw+~V`䱯jo< 6^7{^(vCч g Tia]̣qJiuuzAZ#zAD[LVς`UUMrʀ lw OnYO։Kr l7 9ؔyuY 57\w2+Cjl\VN*2S):w\:9V}aO 5{z'BIr%)tUBrsZcF'Mr H9();!}H꤄qԢ+1Zσ/, ?Y.6wZ||S~'WMC6lsi<9m_m>9) L5NHrsSBN2ӷ9PXmG% #!cww XrE~2 0*Eձc="9 HRm('aล$)໨ЮVhi044Hg)#KfٷKX']ism̬>t{s.޺ l-{ސ08UeÙ>>U*ccPB,a0eNa_a(3&GFeplڣsˉ-{ 0G`4M%s }ײŌWWDk\l㍝y@l) bz/PW3jY1kRYgTk]#8Pe /[U-{1+paѹ+Y MKo=6yPTG{gP3Bf =4$P|]1k`?9)2[)v蕘 GГC@7os~GY. ] kΞ${ɻ~3Vxgy{Bd# =&r'_58? X߉oq-?iL?E< 4au'JPyʾ_?@x1LCZ>\FXW -@]a,t)O1d•[7fI {ԗ (KNy5åwly .W anp^|tb lw_| y@gFX-T@5)3oH5݅B̧Yamt\,*[8ğpWl+AWyn8KՔ"B >}?k>.oxz AXhܴδOO93hyObP_Ъ9ko7;_WS'WA6CiXp:p[/x^AGw!C n!Yػ| :+[0}|7(N!@YiS%9N:_/O=p`hIʒ V]TRL)D  ˥jj  N?=e 'Goo0ͥZ]?2ڔz9=F) x>{Y( U<0 }'X*YC̵A } 6jfًN4{ tv~JUz;mk1ei9nl ` c ^8'y 66MQ%|5|Mcj~1 LI50! //~~Y:}kziz VB+|i?[>Sڂma G[}/hmLf4wXg<6N& &yAXwH H M7! [( qG:@`%hw`*\is[8xcb[!0:lvU_i2;\N\8<{ T().? xaoOi[s.B'FPTqBi9(!g,<9$R hW T/u~Jrnț;Xm%T9t ԃFPfVc:Qp(P>q~n qJ8q~SJbĮY7 ?zG<ہox)R SGN?XJt4a,ˁ11LT4*i(kx 0ob ^Q06zpSF1#xk%Ń%,e}2Sgq*d#y h |L*p @>&U:9GBv`z04YX]{!sgn}1 oq,ߙfls?QNl=p >BUK9oA EQu>-2f=ԧ^É#/9k? Q"*";fgi[<ߪzN@HӖ.}[ٚ+vC򦬝 %wBl-Ww91L/ b.Hغ(q<{ l76BD=ʕǐ~R@4{ 7 3 v]})'n?u4j!48Y"fkȋ`T[Ve,\6̥-Ӏiq8h;kMzL]܃B6RspH^/vl5̥/u3XGZ[_U7 < K`g#|9N\i[3xn/vBtyKOKoH+Vdˇb! 3]^\V,ȵwkl⡔J@•7=NW-UQ{ guk //BcaUkG g1ЎkxC[kk5,w,@Axii\%@UB܆gz ''4NQjq5/.B h/W_ۮmKͣsT팂FA| m;%CjI v7wȅL5BDU+7Πc|@[A+<32Іʬv 8ęO $See7+[EpomkKi%XF(C|3|`l77B*f'%Bk5ͭyT*uVgY[[X˔\12NCd57%X#LZJx)r m].TbbPbAe; VrJ@ۣmW7Bh"^Hz d]Aϧ{`\3S8 H3*/6f4XL]2#SD<^jLsNڃ#wE%UMy`2iH+MIB^/teECfÙ ? RitrΎ*_J P1/䅡y ,2 z= -5 0Najh&UPE4Hk7))qPruT7 TK%A5 2R37*.+-]O$'MkA]54O2kAѵUbB3} +,!|SCJBiWm)<^z,y{[ Rsf{0] !] ʓ,016XoOL_P3P {pca(:ꩧ3Du~<~F΁p3 (젎[-4%ח23"ڈi8a0?K Mm$vV2H=,s7Zb̲} g8 /G>>,8~֐L1FP{Ct%&, F[:Upy@kK{(Ӕ`)wypwߎ)-^ں\u2=AzW{"$.;1uR@ഞcH"$`"9^Qw^X"AhzX/)l3pN͙Cw@H3kAQjCz y"qā* *Q puL] Es[M !ؤO@O))\Uf/o# BTGxK>Ɛ[ƻoՔ/l YkbI 3gA ?u |rT|uS{NzPv@~`*s3hPOl9;ڧif?hUl`@*-=F Lz[Ʊ)mFLQ0\ORQxqޘFu u4T S-)q-}p;7ٻ=YnVꫛU:r f{uPaȃX2BXG`ՇmAc]\cQ PISm5}m49 FNRA$nhdcD+[e6oWK-hJ%d=.#m#8$ <mdK n01a_3$tisP8% Yڀq0c,COiFHS a VNE4D_m˳ճlEl1Xz׾h㇔AYaikjƒ7o6t4Xv[+Y2` d}ύKB ym1&* @wKpTkzO&%/`lì!ח#Z2B\X%BQ xN {e_S>.zVle:{)_ h̍,:H_z5ޖL]Uzx`Ā%֔foJg_= όI r{o>=7da#&y_Ax6,\* e8/y{{i1Hh|:H 4/!Wc现e뀶8g܇Ѣ*u@&mhm7j~˜ p4!iJD˙m딕neg?h]rOx%eM_BȄ=L0R*/J} d9d#jFcwK>@(/4ce2}K|KkeVHc~H`e Qn c=JQUBC^\.w{΋`f/ ur@ٖdoQ֧zHa*FOK#"[_RH//T9. =Bx^ȕ-kx}สIHkA2OC!l ݴ́\)` weA +󂳊>2Ba`LQ4- z( a1k>{1p:ͥ-?o;0U/PݎNWAj)OR 3YoNBX |< =| wj1tH]3j"X~[cFHx?$4DڮBm泹;4{;71P4 p|2mpT$yJ_ZAISH;gky\)"XnDD2?$!ߦ)d7i;@itDndTԣa`~~q 3W!B.D`2(6q} 1 HA,+seb ls#';}K ۏن pCZ[*@R7Mc ^W?LA^)xԎjGV4~o7IDAT3΂)d{i@+KC%|}|@V7RWn`+Fz!-T=Qoo ήή r&1 ..bRT%U 𓝲^.P* G6'cfaq>@OI[ۄ y{_%( >J@} ---A($ 4LXPژڀ,g3!MUY7`%ߔoAݐCJTQ-c#E50d';8C͡Xz/T L_ۏ3@$Nwwnȭ--RAz \B8 BTՔ /Fuc A?c( @Ts2ie3#6 x_DE\gLm1:}VRa/Ft01˸$V#b6B"#?4@(5#+PB^Jv;c2nr9=|5"NBVOO ic Б!B=1Oy"}AdW,`9}M~py)EY`-(KPUOK.RؓX ɓw硏 l̆bɔ6 M+.e HwH, nփІ$1؀Y+|sxC{\' >z<4!D Bϙ@(3b}u x P2 s|3Ϊ썄}.>:#uQ[pJ/U U} F>7e`'l2`qSi,l6 [bS_uORW0JK>Go4 U'L ضF^[[9 ⹭Xɽ /i+!5D D8Gک`w;ueYf~*Re`dn0vVbv4L!]"E(Ħ> "t:jo@ T}*Y9!~U[ _r nYl<[ <|<?Mf06OGn [2EEe-SƂ0h'9 `W] 6=5eQUCIu_Hw7zד9ĩ>>JY?b6RX2‹\OrtF G޷d!8G7(0,R ;ɴV# Wր|:.AΒL@;;Jipd7_*}(2#xoզ>F.{!r8}>*Hk VNT(jPE$a4}h8-^qYi Ya||g/Lxv_HoƾmQQ(}Ji{INp7 @guMTCe0.J J+q8 C}C'9x\,*!eMqҨiu,,7+PomB]sJ;$ӏ)̽$f{ cbT]ɯ+ =˗vQ`Tu9U.⯁f8Gw%% __u6qR h=M'aMggA_B-j? /?9LNi @KXkk#HIo/G s&a-+[4Thǩ|%5`wFV[o@+<`>,v//> & 뾜%{IDOO4P̨bTMo*-ޡ5c:< 0_z A'Gy tb)i$sh'K-B)}w<n܀d˧P{3~  ZR7`ü_YkDBҭCNNh&b2s/4Pàpأ Mq@€bʇ 0B.߼!?BLөAt IWaz'9CE13)aiYy“԰lM 3#$r+W!y.^#+@ktƃjyT4[=)0gzwZ.@ PYZQ@rYr߶Ltɺ%KK*/:2e\Z AٲA;'V7EoP&\3~_C:B.)IX-b]!<팊`1@EXX7H;D?پ]ZЯh@ME/kjV/0zڽ !#J %ix!,dSPem?wY+('Y\*ٛ FZ. T:-Q  Q9m @o 1w'Bz9 HK"6Ml"Ǹ?]y5 ^ !Pp|`y\mԚo%z" tRծ㰰Gyv?06Qt}w`Ers_`* d, u2Aͮv1Ɯ Mۣ0}f)vcY}`_ ծM> ٨.4{M-nFisu&F:YHvޅ\m W %M' S5 *܂FHhD `y:, 8'Z_YJ!-w=y?X=`JjϬ\r.ZºYCW`&"i%ɱ(km[h!SWC)) l 1mf[rBA*jD2ǠUʼ—bvn%w128n -: v Mǀ,O!CBS@:(-cpJ8YLL@r w7G#Azaf%[ϔldk5>V rYr@\"Ɓgii$(==@! =\] [W8].m:z`hVX9!V}/qaQ+}8˪HۀA50+ tKXRπqO'4a8镸 :W8BJmtOK%'8T[M[MHo3ցyy'3 .VT/V^;&GA$KN  ($"HV* QJDrv{UU~im=ssjUzoc6 {{es L>gla x9kjA§SeV|@Y%@_Xv]sܛNV_ U}i /5kW|0{oA #D2 6Vuo cP/e ҀJǸ\EwIOTrpyud= XM F;qHp bGȳ@2E }D[eu>L\\VybbbS@wÚ|r3tgw\4U̿OPX+Z&@{{C׽?ꢾxv%^ۭ| Y=Ԡ\Zip6\>moj`'eZ‘ \4 WfLGBz]@?@H(X[A^t<gO+/g=g3BA0R<.gDA6m>iybHHL߃E ނ{?羝r ]ƙbehMpEA6b0eb hNml9c!ҋ9]L~E!o}ĊOP67Q(5!8~FNBKtH*:%u ݦ;`<?UZ 6[~gVR)40 &97 MITel q17b7u,J98GX6;!ڽhUd50;G?ע`Uwpe+Ŕ"h VR,!(]D ̕X?.# .Z^5q^z6@HldqjNek7ЃqLvq}^R)c=9`lsXre-=| \MWc11 _ wv>uk !oLY Uz'e˹ʹ ]➸ pSW}ra0>X#K%Pvee} _%_%S![6ତ>QWyc Uj= UjX[܅#zt1EE\``_a(UmQǠL '|tCpcK7ZWpԷ26{PQ&85 c+}>.'+삤rrVG~E 1ǴFm6330Au@,ñ@Z=_Ш`^ 1' P_5T7?*][E2M{KmNb KjcQBa x_e9͒mx?\l:bꀬ*DPe$>O^mcoܷp΂L dmvDz@WCr =I!a@RO("^T{4uy^~ ;o!a tYKi>xUgS_GH\ Y _H]jvC.{- 83!qAb =πZIꁣ9d%] X`/v[H0!2>T8yOo[}@ 7n}S^&n>H~|^GeZYM:Se[HeYxGPYOO̗U"I;/SxlJvȸŗ9OjG{BnVP~:K8Ab^Kn4CZd`]HzyёY=S; O>Ew$<£ =!9E`V{Em 3w2Fs)MkHD_W]h9Ax qW/Am1j#/٠tvuSR1p{C7Ҟ`' W =^ Lьä(;T|DFct`m֓dsdH< SBEj8y%h66R #{ǀ7MTjRey} QX $k@ k h`}d]@ $"3EG;3( k8мBDz,ZRGD@{<(eAVQx~%uQ~ t?X5Q]4@-G@.6(%AY`ϑ ďC!jq;66uP>%{/Cl[ oQr[Uf!l$ZG9C PWԿA$]. g;~?s;.:":!24\c\c RL RI{s 3 nŸoM ϋ7!)7)Q ̳*hs7m 8^9uc<rf4Rf} d+]PiT*^ z1>Ȯ@3y䷢ȁA`mP_]ͅaoCass2ǧħ/|i)bK\m-ngW {b'bUuFv8޲՞mmjP-*"g$uHX]Wcgר3 2De yb78|Ԣ栵N]4([ Z~{(̅ZQO+><]FJ~)1DQ\ l1 ;VZnI$Fi%PN* sFоӔZ/ņAXP= )#@.[9w v9b{@)v9"@E~7 V1 U\ejAOK3)G} ߕ'lR.oF #2`}# D% ԁp i 8^wěy3߁=xqqؒ Gc@) yF9%Ypl p GB R7z :gpKvN6<} +({7}O(\;aAo? %iAhols0#' Ħ*Hyਤ-&=F:8BA%($fZYuLRg3$MVkA|HK iTy.?ޗ5EX(@1Z 2%L,B\NP0jG.OD-? @x(NԲ}$ Vzry=3!zC GS +>}n{M{=s Gb?R`A䃬i iίB;+D4rn6(@i[Vq QGD|q$ ԭG=8zBBJ*rӬ >4wHtVvNǶhq(QJWm~ET2O˃T$"Ph4pf%CS\32d[l:ЪRym901"d0T40L1ԥ>W>0Xo:GBhk[5)yg Wx0/[GroϬ#`U`,n8BAmQО,Jٲh2$)HK6nK~?Fp O\Z?o 'L3z"PJVf 'vYpg` *oۥ5q29)(oc^;X;>ݢ/xXrQx"襔⺘ %YQ5yV"5ȯtP&N b[n,kG~ {/:"p|Wf}F9jYM<$ QvC`|YV$ ֞q^^answbcp~,CV\ˁwQ(WxBxw}y'Rz)Hqq 77yN:_+ Ha6>*o σ'@YS=r6k&q> Z)1J5ehiFk nK'{iwddbOJ`]  jmAaO&M,Z6ǖA(`NYHm0ބ.zpG&MYJSU(e8_T0N$8z`,ɍS2@N55Mm΃ko@BŁ,wAQ]pPV*@)f$,'^xqОMpoj1P˧>n N U=Kk gԣJ 6^TR,crPm U+A(S0,]:x}8>$!R3$1^Z;嗊$[sy1'8<%lX)%!Rx1(a :}w  mGsh2' I +В|^:C`˞>l Xep/xjS!;#{'x^O8~mY`卉 nΡ7-{R9xZ$3k@qJP 8#=8yN> $$> 3G@?)z:V˷B]H; ڈy9sp8@&$u0[&僄 }/Qp$+Alŕ r*ȧh'w%9i|3zRmyHUA)^? Pn@\PZ@m୦#M֦!j߇x~.X#wbة0!ஐr&@N>S/f0YXXmoe wJOHy1#8 G*T&/zʫ):d6ŽnYKAmh . 7ӛ)%A]-\ںlA&HwPd7٤XrCl-4.U)Z T Jp,q8޽0|T~BW8APJ|?[@GH3M _"K"c)Аdqx,4%4"Ã@^԰s{48h .ciR G&*@7\{.br (hʨ\̨6%O[!V#F $Y 酔8Z~=ZyYYQ"Z݇nx=^n-1`Pׁ:e&O@$ܭnRf9'm~ID}p?Z o2ہltGZs@Lo P9:N[ Ou 92ŗkfz.烘qwW(?`wn0DG?@xY b8РhY!x\M%T]] .{%= 1NK.G《 %N^ljb);dm~'h/ u٠2,kPL\nTePJ7:YI{' π{()VOY( G3 x- 8Q86CėܳR.炼,;jcA%&|%XGE#3^,5+ĵH"58Zxlpsn XomgC-]!ეl;8y[ Adp}S 7\!OrŐ|3ܫ|b<||V%ƾr[o!p*75(;(0&:񎫓~1{Yb8PU}UO;[RgV!Gq@]YRp 0Ȏx b[@n_ri͎F@n Ln)?2"S͖d=|;xxIPZiu=yD%1JU=B~cm~![o)Xh{\(;pɼ;yCG}w+pz9zD</q p( \E-q_orCK"WzrFҕ$ @UDU J<GCaP*%`퓧!! ˿,Ju䂲;o \=` W#Vy4>5[kʂȢPYȿy mʗ̴|^ bT0ݘ4,i>$TPJXNp/w[.gğCBpOhs` /Ebl1ӿ׻B/ rۂV1_քs8ĖKx+2yD~ϟ?ڻ˸@A7W."ć*!p}lwI9Vt0Iȟ|([{@zd22yaf`WZo{< n5m`N\c1| j8LUu/>? h?bpbWtgo1#r"0ƢӿHa yd4̞ *|3JȝRL:`*J mA9P8ډ,w\ bv]Y,p79I& > -@`8 Sc{\ "9!C@m,!W@Biy_^ԫ @"M@q h+b!!{@C MI1') DC=xwW@"T)8ߎi :d/X [WJpvmU 22"mːQЮ@d1Y|(};7 nvzYP*w-?Ô{a(=Z<_$n%,I^8=F*PL\JߑhE`4/Q6 ߃j!owT"Έr ^ݫy`t6YZC6U dS'A*#w@]J!O]vf#j;%`$(kc eOK{w%dE EGyhg`F;TԌGо(ʕĭvUj5E. ;;~xPy O$>^ yk7qKiYIpN[\ ^~ 鲋 J}6JU] z©p=b\-pO{ e!X3– ++=`譨 Пq>AĪM ڏF9V3V YWA?c|aN#+:5.kP[93ޭ}v9XéS^j fFR"fSGnQAQ9ߺ\+H/<1Br_F܂/x?v8_;6;7Z ao@Y"a1e7p1.XJgն`גuD5]u"|8v@&Xje;:S_e 3uMPf)7 OnqaǀLd%@\41Pm\d!7<溘+mWo(z M&߱oB4v{5;d[)Hu݆`ʹ௢49;^3xIA}o7]9BPUP ׎DB<[qs>z j=v\1ookϘA wHG"8*P^]Wq_~ۮűY@wKQYݢ!V`%΀c)-҄D+3..5 zǠUz(ekdG@a#i/ۢ* Ј ߲Gf4'1c] oEȾ{o笝|ǘAo_=P/eMBVGsxz9Ar0C|4=ܻ|_J !ʁW (=ӱ Fۊuv=$glr3rI@}"JAg- j? IAFeu1D_ߠ-ع b1rHTBߋftNc\/_曡;%pVhh`yRV!m*uwAuoͪ |WObΞ!tu+tUӒP~3Pj(Qy/(]Y߁U<xd,ayPx^G*|ǵ f%R;SYM #AUP9 [{?r~vzBǞ}ܽ=\UƂP .[O?o36 r>; L z_ V']h$ȍ@đUL DG;OO.^LR?xG  H >] G l5FzkB0>lP+r\pMyOy_8W&8>0|:@d|`g<#K(eZ,^BM< S\JkEuW*;^ Ku >|j6Ȉed2 g>`7M߂ fX)+eaZe$L.þ_zeƄPkb $>+CRhM#(=`˽@̽%Yrݛ쎀->@;  )弤 SYAƫ#| pdͺro|\,d-O1%$bPMP'#8/%E`M+,}V*PQ&jo h-uP8#>;O [3get8gDC32r$Non , @ :-}8󓊌 Ƌ7}w,sҠO a$eh[ - Q\LRx(^bSegk5PR!}lP3b#țTJ~XMhPVleGwPI^I/] c\C!hm~o n)Ae?x씭9/Aq:[('˲`/k3+ͥ ˇb(v; )'Tq0(sW54P>|Y;Je@3 M:2ʳV%OBT„//w੔L~ DePMx(PF_9[ 0&?dBAF%#B&B{PnhU6ǁςs7 2h6Q]\Ocw ΧgʚhH !NslDeʻ*M̅CحK FA?R-f[ۅoB(FBZRldi.2L J\eA,7+8VFC[x-)fP,˞e l`=c@LPZZkn \ X\C>ʋM,*A {Uc"Bx p~z-?P̃5'9)!(kz/0G\ lKd}Zn(+LَL %m|'W^+l65TexY "@ 6&jyO^gDK~ɮ D -xH9DG d}AW}`Osz>t1K+@ۤw9aofl)`w^NBB$&2[ȹ )9&a` IGSP3\h,CyH(EEp3q(stO+>\ۯ\jok_|˹?r%$`NmF 7q̘n ҕA턘"]y߃x`!Y{r) "c7kgkh#W5tȹJPhZsOQVDe~ P=^@9 *mL+IpV/ s IvYbg ۗtt\l"@&Ҿ2,Xā"`T |b;.u KR`yE[}`GCb"W0F#@S1{qj$<7)d;tIpH׶Ct|I)8x-PFf)0ߎ-S!>E`ʬ4֩Sׂ<]g;(e*^>h-n;8a wܽDEaiZ&صCïwc.6=D5ͮ K$%z1gJ{vQAm,A0ΥyVF lR4oO@ҨX5ܹWdg"y`@!0+2K{UkZkk>T 0NqQ@Tc3梏L.;b虸' ׼Ax] d]@Yn|(MUu[hY/pP׃(hd^@;im ) A;Ԓ<{@ĭb'(עςٗly; ԛzgqOAt@V Cpfk )3P+/+VB]jyge^S[3?@vXA\5ػb?_zbg8#C`I ۉ@;o*&&|>PJyU??Ï޿IeP̊¿raϰ Pow50>h˝;Za,6NM30PV8(I`*x* PSIfssT3_%~d?RT; yP^: uٹH(6ǘ>$W"&](vŴ " Bn ؕP[S-zDX9R\`,[q1X_r3I\'  D<ovJYUE}!jkp<)S;53_9@H'nR6q7Oijz \-Cje]a̫`ߗ-dqHq̻cj+=8j(RT`' A/qCXU(^!(Me@6ZPyo{r!d+ۄoAbY[i. v),?_%x )^[>; `o4VlK<6RmJYo@hK]o)g;Vx!>+W]@8^x?29'D r]źJ L2%}ϽȹR"XE 1e~uUe!S ad7[SktQjf(S`߱vxYUAT+on $;7#ր< Uth<#"2-%n7ya5rF?lM56 }R!^tin7 zʉk[x C IUf VkN ~џW};/iƤ8+UԍT5ZqxQT}R!GZ`,UOk\E Qt`.|挪uv7Y3T!4ڞey9z1۳#!q9͆'LpZ&P_V3 6 d ڄZK# /VRMh1CEq|= EGs QtM+ yϠe?Qd}e-x_D;xpaVȿGǾ53 1g?{2O $1@n\id㐻RK6q@~hh >ş9C޷^7ϔ bHݬS`ƣ1s| Heu.b'Y eUb`g<:8ŕf߿;:7P:|I@IܫT\{ XJSs;ʁ^hs;5}.D+]DyKOԲze@hp\ fF~o j|h_SZwTI| g橳*aA)-0gPN0{CEVryUn8r<0T:3 P>?l?2Txnmsmxp_ޑ~V*-}W:OQnCpRFJXm*В@OYc>=|_zQf{U :2%s'ln/񞂘jP1Էǁ1v0OTVz46Ye{m峠6Lm \2?K$wɱFrSJe U2F/wX,_"rpxGFL zO#[ cAYhƴ {kDd|w} 6P!M@G*$_RZ|d~ ڃzQ f;|q0뭪?E0~,zryLD%dPJy3^]Ƨ]%M"r7rA!^{,, tn׹MedހEᑨ$@ʔ.4pr#^d<8Oؘ$> }g# J_( |P T@'e[5x J19*n~AyG;#TP* h{@ķ ɣr9S tQ>d[+ {>ub EeL.(qOgDe1<}|;VA.IpA|VJ5 5{E]UPrB0OŀM&xSrД~]/Q_IOSMw샂hM޶;@< +*) AO"TM81 Vx~yw#!H%=\!6/9ANUG*"W 2]XHX[8F{1Tz@ש + #i[+I%xWduOS..r`&k5s5`g=vڀY qi :(:`4NHnx5soi:inSl=WƁ&`R.RQ^+ @z5}!3[uHȁK޽\T}7!؍՛ L#h5D j`?`,`tv ln63jzPD]qL? j =9 ؂@7^ꞘU\~к;{@Vy}ܠTA_*V\WV&Xf%(< fɅzLK=8GX%g&`v޳cC%*QZœabxv$8#S< 7VŠԟbjPimAn>uQ ~F@C' ^޽u`6 v'& cѱ=FWQJn Fvyk43;2b2x(>x:c2a<~ b(eeнJ9*j.N{^ 9H%)z Amj,p-GC`,H^쫎 ::ʗ@yJgWX L=1DmXu7[Rq4xpǬxP87@p4 (%fZ|62Q9Ws <4(66~0Ii՟/UO09#0xO;| bf*饻OҝA)VUO˱~a1LQKIؽ X=m#h9bv40( t%|PQ~ A:suwۇ+E]H>FH]aVXcNj)c&'xk\ ~ųTV{y2Qs cWj{ rw!ڼaL?q 'M`K؋!w3f¹|_eRڂhTP+E0 ⿆BϼrUPO5-~ >W #9f9(ڜU) ^3[0.s`TӆZ5QԓA.eʳ ȐFHiÌf|1/_q~ Zo# 278{'mi j9RB2~*=8h]`1` ߵAr w!%/Ү_TmqW7x(%plQ+CO/ڃ2Zd-A+qE= StxT70V^r:Ԅع\Vx`DYOOAWpu2 Ԣ:[5r>bbx@9pF)ĨT:'ߐQ<~aڜu2)K&QR̆gp߅2*,+AEIW[_M+Ir%R ZKlcB=mAΔm!I fAK3>+(Ahˁڪa_9µ<JrUˁ졾.Mme8[UG22υ;-u3vzo"p\Q냵,_ {[=}+!4p6kO~p p@mOΣQHЕ슠4*5&_5"]x΅耢 Ba{{ J·3pb0Ul^Dt @|f~ ,Q\ qZ/n,L| /蠬C~JP]zG:w&YU}(9b_dmW@%AܩP\%wwOPALPƒv`Z!eyʏg+/J=(l ap3Կh!4k ȫ\F){0"FPDx~z%p!A]pNy:w0(%K4`OW;p* rw9VXq*QHI~x\0B`28*]*poXFI[׃<|oܑEВH-QXmSx2Fw{; YB 5Q<MkN7`=>i HIցr-NB"p-2 "(1y`h dFw؍ a чG?0DizQs uvF~LtWL{ ڄ/>&s}=iߥN-Ox_uKbwtqF=g/|Qbs"$l1Clh M(xCJwgWl:(WGu`6:Adwd̠lĵH}P}RA+N9?j.£ G>9s_^fxCxL %@Jy.xr'Ty],珎0?NGB}^U#A֗F}΀ PƼ yTdAI{7 IA$*a.Hd^kD-(@|!Pr~hLc=nb O B,^lZ##q*^ؓoY_Lc@ FX3xYwf<_Cs!N7NCd9vKV'x{ >BR+YW6J+Ah ,l(Gˆv׀0@f S7BX !+{ʁ~?v^gn "j 瀵qN |5A٬%K iT)vN=\f ?}B~ү Ɗ2V,2A$yŶρVBğ@d]j%f&vWp'(6!(Q#P"?ZKߝ`] ^3̢F .H/hDE 9* z:##h3n`js<'S/'bs >1\Z1ӥQYxAIWn#"d9r?,?x^¯F5?~J4RK 79$'>F u4=(n ?- B?@( nv~h9[Ic^dRyQ^Ct]|:ī@ՠsGo/_(b\ r3,Sk@\U9v(}Ad9k::o%X0uѷ񆠌ɭWi̿Ave3]wʘy`W',ߋyM RR@IPRR6țTg r6IƁAM1 Qȑ P,.h3<{A67dx}z?hXNU"锱DCLBw2#AJ7Ҏ]J*ʾ'o,|a p 9,-؟xj^'9W}vԙ RI (Phlr-GC@lPl'Y-˗Aoj'ײة|ݎW ?M/epA~cj9b!1hq|=.)Uj)W % 6}`c$RSt_28(q {)De} z1W)!}oE9<اv.a.G,.uBxB9{(kяӠѾTjƺ jh_/} p= k 4"2.t)O's%X>Cz> k|rD Hӎ =i\zTjvsE/:w.[m< S_sE0/{,H9 YjV.fgW"t3)zfޓbhMDcPFv`칡 :/<5>(U\z AD)hNl1W@,QU`NT~(^Ώ+ jwtOm9V*0;/h8j8ʺRA٬\?+LȰ^~p$r%%Cf%h7P< G '>Jk7D,U ~"z,#7۞w v2jF@pTZh>~k#eks5X ⻢_/u΀oE΁뽄yAYM$N;Δ'm~P;`4rr/#=K fYVfkc Ԇi0&9B#e1طm!Cx,NiauON/-QӢ9AoL'}1Ftb'#%oF2Ar?~@O*q}yGp;e(*NN|,Ҁtk@`pTpVԓZ'YCV`Ax7h3W P1#H2WْZhE@ }&]%?AE:_WddMˍ{`] ^0o@qϵ} [M E Jr10%J)i)_hMۆvUg]uӕ<S:-7UT:}\Pʁvf8ZP *3JdgpU:D: s3p5+ ]pƅ"b[1}h?N2iM}@D ؜W=ٿ~Uޣ7|}@qo_= lEhlY1n1}7?>0yj&Y1NnVʁ| JA[?E,)MȘ5^ ppK\1WO2N!u97J*2N,kGs}l}w sÁ[.|mNs\8$.F@(Q \T)lc#׀$#dl 4nGE(=D@dBGb'>7cczl{zB|2>/UM8/W@cAA^5O"q6TZ( lblߞ<KrTwJ+J,Xyl&Rp]!4Iwן}›F]Gہz/7|[1 2LV@db0Aސ*:)`אUEg<Ѡ0d"OH=(oZs!aw5clcYWѕJ= 1s%{Er \N@v/60I># 2B/1B[\\2_eU\k FJTB@IAD:D iiD%P IQD$+vy}?c5}<nj1$((r'<U7A A )mCӃ!x*h|CnrPޏ,0ց] *GAJ$ 1>v^2XJ3 ` qi6}-pA7|d*}zIAV$3݇d[(ཀྵ/\ _t9ƺgBras} F;alvw"^KIVPTpjvX;%[  sʍ_C5ѱOSoc(hb7SWh?| ̓@/\{r咮%ƕ~hN `4{Ig$r|9^;Kd |;z rMtOu5v3">9:r>(2@MZrxin=2E}y H>pՠuz-&b e A?wuoPK3KO^r{;@EM0XMz~W4Y= j ы|T !=bXϳ >(\?O7jf!T =\|«Pxs^UP"^>ȸR z`LG@xa B$$a2&@&?߮`yAw2 %CZw@[ȸ OC2Z73^R7\/7V/eOY^waXr2^߂8K<,ľ"3<: ^=M%}{ƊB|zxzD1 0)\"'pE ߁&.FY~?AU"Ku;7dx:: fb淠 Q "cNV(nl17@xՀTm@Nov>xtS Lyi5"otN}K: ts%=S9 ~[B"o!;3 2nnD?-:]0Z TÒo٣ w$8VOCx)e0k7nt/ƀBnmWDH\eݏ35XSd8xD\%A@춐ì>H|S@sX#dϯ/'\=h@3ʂ)=VqK^R1Eϋlh@i!2] AE9mrbA pZApH-+FkZWK bp1o'!PN]]W; o΋]𾼟=Ȕ{ bYTe3udZ9rJBlfIs1Ea^*c;UpM_ tZkzLF^4eO{`!3NAai_ PѨ#aNpc[`^KGj%űX%@-+Cu7#Ott]D6dW~ĸ,oztC:#cA_U7 y7G X ]Q 9)e zkwC`.16'_L ou{]Umt7@]|Ko37¹}% s Y3r`"i௬?@f/y@2W[f~݁,ҹ D- kQj[A+e0 ν&Vas凢 9z>bX"|E~ nIwzt]] b(d_ BN݄Ҫ5N 89ee;}z>^h ͂}^yF4 2t ۃnj P}ap2>:{1_;p{ņ΀u+ oއ\&`o#ӁgҎZvq;-&;|M3Vw{7vga!?QcϑHnO${@iQP:|pH]7K ݐG7@7^PzԿZ_ENa QZy#`׉o'(1d)HmYHPvYAf,3Yug 4ʮf| ~F@s.dYrܨCJϐ6S;5ƲBObuA ɪ|ŀE?[@\߫M,AS% D2A<'Wu@=1}# ~q>JT>WfB(oZ@oRW!qYAg$!_9M8j?l+*[y)OE1$Z%o'oъ k]5 ܨSͿ"X 𥅖:AwM; aLc։Fa5* '|m i>#,BV}`*|r&īz/p]0Ҁ|d\w9B|Alq{|/^ ߫ KI?5Ue ӌ+*9Im,b;z1Ј=p3(Duyi Xan"/yA9 Yj?&doPO('y}ƀ*{j({G <@#=GԗY]]{z SZT.U+d xwfwA]QȦ@nJsxj9+AxP!UkP kM9ތC{ n8.&k+(`Q ^j Z\x8W#7=Sə ~C $W f ۠t97ƜcvF3k`wDbt|H|84quE``%[d~#@(*uYfj282@"7d1?aqm˯8!A>$AKqRQr3 nRx^X Hjx3_76*O^sYJtb!^>h~ ?_9V| cOO@i^K!ĝٷzBh%HVI>/t?q&X [ >/HFP99N;`hK5P:1&+=9zz*6svV-zn]`X V=\z-˞ܭpmpw <+1N2xa?x\>R['V}zuTЏU/ % Bu Џ: \wgBB*{LRZVmfxzjZ1M 0k/ϲWo!k)C}* įzk|`W rO|TBLfP)@ndӓ6zScp>S$ySXEY` A:xGsO dk UXA o8o<-hS Muʮ5yι@ lRٯ QHԗd3B/C!R=MdϘ-+ RV9Kfj, pC7 tC`=8|a4aQIWB]@W'_(MUQW,5A, c>Bl_wtw5zYEJ%%c8=7dYP^^ȮE6?}[_T@^2ygzPgU{1; 7=F>k$]^l ǁSmAD.~dm@'0^;,`Um/"egSp;xZb:?;w*0d3b=>%6 j EAs!hO+$LJL =0pE>pT6pB :S!(^Uh If# WKpg&AHw T=dH Zy*!p ~g {[QN{DcʓhJcWX'C舿 A4Kf00ˎ9P;Zg.ަ$'{ ݡh0qe.Y N5iJO`\W[_Nl%Nc@\`BpD !u f`N [x§~b2QbQ z5/>n +D67Ui`.M)-w҃'":{~IQ}5#e05'+'/$wjbCHi9f`>46rwAj,pMc8wN(V῭ Mcn…z; e\J#K@WJBb+~b-ꌛ1^׈B{3 ~*U5}:r )֋f ѳ:nAco*6raN=4Ξf?L֧r9oC'{TZVó@+1g@ps8"׸)GY\#-Ow/%)"~^57@|'P-Pm'#gPHy/ !ѷ x&>T!f w-pVyw΁\d6N _n.*Kت ', DR^ <c G|ަr|"l{b6r/t:)mKƇY@x_B75etwC]U .->l YV@`,ݒBe(^ vY IgDpOs ||%U#0>4[ dZ[ T5h| < # \묩TkSdIջp>e7E^]ֳub+Uueŝʀ?_.$Yv{4udUqAwf''g`)PK,6rD6zK!z xZѧP0Է ֊ 28!#f@Վ1 ( jZ{=[<:Qq$M!kSV¿z`H!8MaӀLc1ԡ !DOpiZ n*l2PDR=2wRS퇪/dƗ">y/l 5~<_IKTh@kʅo]δAFYcf(x` R'zЉT縫^ƈK<z\H|gqP7e.\F:F@!4z*' #A?xC_p` Mݐ<64!,P![E5Y2;QyXBzHE[q 9aPto zl`;-k5 w9 1 YC @DbA5 M!X$z<3jJ ć g!T7i\,0Ug*4 _-\je6$vMc@le|X"/9ޤXOx2$ X= PU\.:!_k3ƺ$s^o; 6 'wA\eM`?)_ӟ) g~o>EM_2]<=/$4į}BC_BŲH."&{a>mqIWT@V>PUM@X z+u)Ǩz5XՌW8INt;mA{8@lUo$m4+CIz.8MNu[ zl9ҫXa+1sQU.1_+(-AqS= N3 *$L_@wU**bBfBȂH\0 9-ߝ c~]Z`4g(adLӃo,ljD'pz'$-7K<V>#/!@=QgfЯbd~`0ہw5yp;!;='6,'N#wo?+ jNAI݀# 63Ѡkәd+H-pjD%?O_%@F3;^`f'bă%PYt -XF^Ȋdwu#8ynNk#b y+&cAGhѦ!%9{DU=+<E{Чki=] `n^*k fuMz xU 6q;~, 0VzQ NN?,}3@NQʀM.xc}t/HOګigvrm%jȇ_DDIN(tib ?Ie@`Ph;K`eGk~G_ѻ!V5Ubo;֫_!%f!KY |[Y%C¹w!*oAf+wzs\)Vkw= Jdv><{FmH47pX7>Z#CJ<XOg=ItoX j?ŨwCua{cXxDp =yPNYDY}83Ҳ<ὢ@Y֫`ML{c@IQrpۉr ֱh&ЅAlk7# wIo$ZD YA+cF cI DŽ-@˝ƨeSMz6n{`4Wxk[K^̘ F)_c0^') RG`dt{,D G+ά \aWԛ~Am{n <>!|-lWo!'k1E<' Wμ\=z)>.O 8@Z 9A;,ɏ8_ꅠ0Dȳ.HLqR^X#/d{o ^ 31`lxI]Ōe#2\VU`zyK\.dw j&7AԌ ^a+ӎнN~⌯+=qOA7gb5A]斝@fܥcZv"iDN5EYbI@"3|1c8 9ND^gJ6&x/C dQkȱ@h1̩F*^Ɓm**()' n Z Mw@'&둠?uS4:EUʗrb>Mh} c'-VwxUV Ȧ $}z+.-.w ic ;5!D Ѹ9ćI@ӻY z~\TJI3]Ñꃭ6D9nFΌ>gd餩/f_MEM|(=@>PժC1[#dG"0]7?~Ko6^H\51N{3H9d5z37XQtwUgUA y;7y{M=@vHTca,dp ''wgG`/{.- mLX @جe6zX}X/ۢn`:9}%;bx  +CY`^0ok!ޔ/!ufĦ9VtB]P!pz%d+pkwDU'W,w-8Ug%^U]OH z S=\Y\`G1٪;BBYVq_,W1ZD r<+v NIǍ<o%Zz_yțyl ٲ}r:_a >a0k9$v >_JGAp`os?6YxIkVU`+ux3D*"@_"(&o^ =0FoWx̴;xt6 q^Y|C@/A}CrJN<\]%p eTBƭvW hy(H*@L߈ [CcPڝ+d488 &cN.?^sO w?%{unr`+`1J40'DGE gȉƳ $X+.N xʾ#.ˑ`u~BHe}Fbk2L=pZ; *Ga (0+{ ȢKw% ꋈY:f/ H`.Z56h`|>F`Uy< l%?A'Ň~C5?XUw^g1 j.kց;]{n?dn":w_-Ս+@`2ջ&^o\hfb_ePS[`of'ħ*6X&3^q5 rDq+K &k tB|1l}z Na*|D"n"o(x$R 5=QG!4sVМk@:|J2ODq6jW~6Mƪ-)f(2 PM1֢s{Q-|:o/ > { n3]wW * -Qm2z=졪$yIs 7 Aa}<0G;9Jp&*`Iǁb_8h7>5nut?9Lo16JO7S5`e8Mv4:7e&hX5՛_]ܪ>$j/ :~F8$VeM s>AlK,\VtK1\6o[H%b9߀CIYlrG0c?'ħ{$+K@`. n5,]ɑ&|@3 ?oMg!nj~s ^MD@Dlps`gxyB;>LV0oʃ%n IvqIS!j\9.xսg ;' /C| b8U!)On 0IennPc,VBlPQ<x[vJs]tȋ[M0 &8i/dLX'^*w[`Z8gi঻ɲLq( jrg/@y_/|' @? L9 `*Nku {XZe>|)<-:^.=D×`Ti *%ƃx)q\qBY ͓bMU%.s|!~\PGYm 3_Џԯ49r1SHu[H4Z,b ų]P'@,fI@"ƃz8M"D]fr.n m@zN+p@}(BcQJ(2dEz)Ma{+*ǮszYUOs/^?Qvy:-))'k`5p=FأTyؕqRQ2:sbk3٘ jd>UؽBnxiiI>0>#@vtKmxz~D2$Le~ٞ:ƴ'B6w[ A f-Ee*3QsgbiAI*G% '<$s?WY͡bRӊ .%:qJ&"Dr>!3|*vE- h& BdH=P?yH+n{>J틷|^J&Ayl Z5t1q/sDNȯCƼ5d k\vp~΁ĵ}AMR9`猧!ב%\l(*;-+S`үF/.7 Ȝ2,9BGpt}}١p$qq#sD%5с L_ά"uQ|4ГDA~!߈?&Rj@]"\0؛],7[V;f-a 'HCC1ybe/b=']&B|onEy1JL*ˠר}nn`NV yl1i+ϤF7[}j}JF0@} ,#/X8nc$x5X릗X긑Iw~Vop ^Dw`}}:!D |/Jy $/bm< ( 3:0+Ί`7 ʮ) vKIςx\ޛ/wI%ppB9"o*y; V.. / 5oRЌ^-Џ2I[o LQDYʔ w zr ˲^= Rh=R} }| >k2 RzDAN7O Vn˂<09E?{wArsGT_q`>`x׸•}=L*%A,1^3 ƉA _Eg݁(2>ST 늢[@~H,*NѨna/K *JNIFMq|m`KcYtUp*8{ X:Xs=tPUQ vS|ժ#k+ˊbj( z($C .UMxQ ga͐l4L=YR'<cWnXb02|N%+Ni}Sj5]t~ėp'X+;Qmk+UJ4Dw${1|3W!wq%0VHvIE!N6>[5_S@-d 9=6烨(vSğb$t0*{&NzV3Mֆ0ݯB(I^003ڊ(-z,p'7]7QD# u@6J Nd\4SAކXWDT@_OI: d'@_j7 j |0fE>?IjRT)ި;o'^[M6i<쿱|u *2&@Xֻ _8vv^g >i-@q{Nb(;nGh4 H dHӺ4@.r_" sU60<qG@/Z][/j0)(2Qp'XSEmQؠ"H46P*`fYIg,{@g],DgFS3G< ;PJv D։A/yt5*7(\O> SS {(ca n_zĒVV> ʓ]oF+QH" 8 H@Տ;I~0LU-Qۈ.>&@WY^/}*ncp)Z=T*D+;9uR})Lp""!{p?SC\)ʼB<dN^}}&uω.*@t߀Egl0pd{σH}́n_?AS3 d<'35UcFxu TTdf9!c/s/\Wt*^eHM | XE ]2*E_Y^l''\}SwW?[Q&V5jί*pJ47 $S#^7j0^ewV]f#Ǎ' v[Mw" d#]7XNC/sʈ;`Y#haA=qz J~e1WGWVX$jlJ@Ǝ8jP B;?q3? }iwՁkiʢ~ m&m7vrAuKZ ڈU0Z߉3tPO;@։/'7moT5 (~@sFk`Ȯg Y ȧ>x bAR*Ü;@,a^#T^?`-q=T_]G:@ܤ3A~jq[QZ4EC̃@gR@9u TM y? zKj9?H~_@^j/C"deh4\1~i (J?"'P".B%=tzB@g*X]T >V~@ #U, T /=D- <+>Ao9IYDC?AI+LƁkw5A,~1s:܏$0 ~W G{xuuu`eC[!ﵜ!w?5W 5Y@(ϛK 1hN5y"V6AwǢW@ߔW8c׈Ě\@ roSK *99TU)eIJe+Dj-]ח⑐lby?9p.VVSn\Esw (fVW aW'XK&o58jj|L%@ݷ D*{A8*/) ɵlӈ@+jPq.9H* ^_-m,e+_uf} : <-=J1H 2F BC-^uĚnx2eTॸ+@}^`.0k@N6QXCEx] "og3uL.^'3 |'@XB556й>ݕ_ M8= DmT45{C\Omu5J@thDxE| Y@.r 7n.Z`b(_\@@H"_8 "|5\ O|pO n0SE*Cz j$wC8^w< zS%:2V-Z3:p媤յ/E"uܚ L54B4HovCr@ Ej~l&L3p@.:9߸o]'^[9SέrD%8VΗ`^0z1 ]_+$Hp6dRJCvNye<#:ڕ!~P#8gn& jR:1#&! Z:w[.!p>{I.,zr'^'b*Xo{r| rҲ`^0B(oD`nN9U``=ȜyMMq&s_!yT&+OA' *oD-@0kG 9txec7(K|DA1RQVEX$Xºy A$[X6'Vq|`wǜ*F "^%_5ꊢP/6a3p:d)x1 (o2 \U܊n*O6MY\/ u&+7xW o Kw7Ȥe6(k4v~c.<4Sc{Brq}LNKka;~X^)5N7gs3FI~[+| .ڇ~0FJ+v&n!V _D5]{dw;g7|+r A+k&;|u+`myZty^3rOiar cD;{F 9| YmhAj}']K>#[wnR Mp5l*J@@ {/1Yse;4x1^+D q#"Bꩮ Ylg`W Gx " `6FA upk8c՗ ߦ\vD 76Aධ!/J|bT/|H"}D; D@pySݏ:Nӝ@\ {$ LCN'E31DNO3Ae^05qD<'wCQ^$.=f<'Wc=n4OecA:@"?(O6h AVq&uP^jпxM5 r+|5Hr؉XMVY.cct1zPDz‘,(">qc.{ .]Ɨ P1?2@TU?ȪfS7D1S 'y}j `7p贈`0:/0e12"Y0پJ8Jg3ӯ|}/bѯL <H1&a`-1' q1w_г>#K=W8UY7,( !L5OR{dpʉR 8g { OPwtG ݄%`ϋQl;=6J'tpƇ"{ tҋ&bpЫYUQ2_VC -{_$ <.A|Hc4_Dg:EF&؟a[@D`N_+j$cD `s` 2sESA]D 0@oQ > a= bx_@ 1xo`<3Ǯ 'vR*(JQ-6}| "`/tc=VEZAӬ) _<i_z E.*h]ʁiqD Kr/U2h,s7A ~yO=mCBCvE: KO.A뉙d.NWdž@o5|rAo +wPU'NО ¥ %(ۺ1~ohn ¶PA}p웠 f.>|I`PѮ b$րO$K| 뀚"7q0F";^3&}ox>= 1(P_z~/Ә Q@EWPP;tY^94qV_DIxsFA8jΡs'!ЕO.,tz~PJM+Vy5CV߀q)ȒF5lۡ`|-s~lB<`Yt D1 1? %$gA1V59}UWBpb>+t\+Rto_BUD 2Ti`0La*lYr#kTWPDN]dg;h^hSe`Y џ~֐0l*[>j 5)+gLcA^`h)ZpH *z-A9j X0ե2,ۀ1ټ,*8a/?ȼqE+Хu9ojqרlp/:>7Pj):z;PB惌%qx:1Qett)Fȧ >'u0z5zn1]/8,!1|sXA TAy+>йb\]/'xRҏ`t 7F^YcaC/: f{33N&1?CBԦ,"p@w6NG)$,A:K K0cd[p_n@ p-7;r, FT,d63)W @%ʉ0FO[04.ȟ!)Y=pU<v;[2O!TL~*N0&H}.s#+F[) DB/? ӽX{d2 w`ņḯ1?0 颐# ` ( V^AL!C?_D4] <Yǚx/C# [l-<uOq8"C{N3 GSGVz?λNU(ᅹХRe 0>N[/~ <,\p][- p2 r|,(:> e9.?)ⶸ/ϋgAQuQFqY7@R!2iXqJHx)r6D#Y5bsAw/5vW' zoQGuٻϸLs)CR~&Rb7i ^e.&3U"._{}9d7Hv]ҋ@v`0xʒAnl50w%VV+!NɁ`lā Pb- Zc@dY 1 ;F9^^kݛf[~~"ܠ'8D׀pKg2;*oܺ.G'3CPlܶf.`ޮ ^,6鋚,bhqe<o[\]FA6AP&] HG 4EWYx$j(gUw̎MA@@ b@0TT@P1 A$ P(I 9nv=3ݵ?؞{~y3ݽjUW޽_pVЉ fs=m &b>(h}]Ng:Dm !Y):LBscbRz4 e.B6)3}Lx)` h6J/,3cdJ+xyb+=y/L՚Q'0w0tx;nAF5H4]>R^n$͟nZ\'wsd4lm I ᧵#jp˚!0K[֋˛\"Cpa\gd:7[;='ȵ %@ޑ[?t ˋ`Syr^F@L } `SH2 dv_L_Ԥen-ȝs/Mz3ͽ*&HOS oR|*;z̅ij.Ltr\Myܫ)gp'wSwf7H] z_u3qZ,ޘzI/ ;\/ %dR :m@qP d(cVkq 3a3vO@N^AB\ca>GyNw().@UiKgK* ֡+g>2🈿'OWύ̥ OEG&H'[CS=W1s`u gRW~'=44tNs!5{/J,)fe\"t!g!Pv!Q;i߅^r?=wJڃ̕4Chx3Б6_mcX([7eLJP H,Wq!0i 'RHɿ0QNeB˧(!?)g37^@bgpf;`ҭ>;AI40? c?LR>$t-D;Isa僋ú N~ V[W)H[mk~ K%_$oVmjnpz8!>1v'&)@n`jf1h?[n`G޺@Mp&I 4[ ?Astlb(hi-]9fꃌ%r LGIޠu)h+kdU rPБv]~x};tl ūՉ {&[@H@h%mZJBxPw/h6 $'n nG}ƃ֠lMs*Ii=Eg2ނɣ' b k: &fojp L*N/3GR-AZ] 9^4m IF.D;!$q,k(d>]SLg  jAB9N ":ԶOG;\OcA3A[z@XK`"4 h ?$-޶v;II SOmsKL4ɉ7nT %z$Jy#Cl28H@slS(ȫfx5&ʀO'A`m0^ruz e wX y\&7Bיmr˂]hIwT2Oo7ZOls鄁,1:o\`w@P-8 Fb= I5CX̖iiGQ SQZCx$1TfYrTBS"uyd3 ݔ7x%`2A wd<^g5 UDpfؚlJ`Jx_)xA}}}~D86vȿ.4P^YI0 d, -` K]AB.S,0R+N v*%B(Pb7щq{#nAo2B- U'x_{@42ݫ@0̀:!-)\ԕTxP@9Y:P/* _P> l$ta+ Xjq-Ksě g,JgB^`vZR Yk^.`{nvwvfkR/![DYZf W.`׀rC@R`4gPRT\V^ fkeY,=!VF` 3"- UFx| >0UL x:.<z1\ʛgw.8WLC]0`mIbd3v=:"dl-]) ~g:y\>=ABD{x@zzPI,yQJ7u -9#K,б:N6G.(70p!h~m@1Pr(8Ŝ2`K[]r%H>VӃY AwvzِNtn/i:Ĩv=nAtxMғsQ^UN7t=٫sξx x h;nF~vbO& ʏׇ]ětyN~]z['؈HCB9{-CruA\ y@l-~0HLI^:=q}%|kOW;HP[-]`ꙇMo/_tN^L-w9AO0@_i4Jm0 HpZ'IU `Ҋ~Ѷw= 8zD]v9 xo-=P^5Q0Z3k" [4bl;F4`^S>wsnA6JB\8\£LФئgI#y䶩w)wqs]KYj)] vd!U u-A d/֚.5$5)ڗ|qOI}0@/ >@KI!`GRUpit3WW"1rpl6Y ܧud`frncЙ,vǙ e:(eC=3!<>_WU L ilӓ@#06IJ`"ײAVi%2;z*(\M09*0_'v:CZs՘/4.0xN'&޳}yQ^ބЗvw*g&`Ƈz;oҿ4n[L9V|0h Wǂs%$2m9΅v*mʬE'ax_.MΜ?~Z3\{ǬNy3/˫ b{3%Ur5g&:\{` ^u8}E@$,1OD͏=؁Aw$K& ~@3r+^!}12_V( g Y/%]ѫI c%w6vφ[#@C<l0@,x"V{*se9s՛@_'?< K0%9x9ȕ`7ڱ]`>tsv@sy|1=q@sJq'> z6gp%`^0jQf>N;l=0 v-zhCBpX ~{c*$Ln (!M2v 6;mse-d_{Zb&"p~, j 6,~&6n֦wZ/C#C0޿=Hw{' 4 LwSm 頞 m6\Y{dza%{~1:3[0mqoir%܂d>ur ٠_64zT2H#ӂ5%o'i8E%(+S,\ Nyq(A5]NM)B]~q(f<#}`ҙN@(QiBEv8kJR*Ptn9 \Ee2l D@Rݫr);D9 `p@xBgQ>agq g5^}u[e-^t`q9sWu'yי҈Tş912B&ɠr}l'LI D`0@/yt)pfSTGy2DҀ:JgJUJ*#LPFTiL |3QT&0__c9Fp3緐нQX,W-;@SG9rx>P0q)N He:,C oi.6O = " XV^ySQ/@'pNlY"d.~ 1H<,W}g[2>U!d>;dIgO>2v;m * g,$`e !xQsW\ C#`ئ _wcoNգ3?>zf0k5}܈]ll_)u) .gHiʓ S ^vqGH"01=?(yGI8B]GpOL t~i$K*pFp*s/ЊiP,%߰]@.$8P@Ur~e$o e(O ʐ BD , P$)"e%z/wC@_| [{dlfS@lѹAn1:A6X*QDN=`0#Mn@rd3z\. zS@5_sAI?P\|^ґa Wmy FgANpZNc<Ҕ2$ Ԑwld0Gy a7ЎqƵkPMS5u\c:<o\1q:q{[`zq@JPK[G8~A4-w/ Ff 9!~w뜗W.ݽNؔOTc9(vp[$c_%!wk=PLb2ov~;_ "A~A܂[P~8VXO%E] "$  @6 fu.g?ё2g?Z%Ӟ)vpأԐ{W9#C[@@qQnAP?i?,7V4p fS84_f"T=Z{`%yKm)o9Uf^^ɏ^XT@?)fyomua9qAww ʙ A8Qd $D2\`+5|#@IJI m(B:~fpRH!7(Ј\ DOٍ%8Ar)r^A-.e[[Po;Lje )3A\l{e`O^(ϸݚT9u#񓋎NSyDa;̓P{VO.wDNk>ɉ + 5on!BIJP"aLgaOg82A6!2ātAJ7"|6rd,7AoӖl'KTȿ.?vXSB#x+lxD3HJ ҀF >ҁC؟י~R2`_. V:>F3OQ8'1 )E=;""W7ӎG Q*_r3w&/IQԲ)Mi@S 4Wpez^ |:6.6t;[8,l4o>@n7(˄Wkb@഼O ~ql@ó:4Ҥrs.{xvvZÐ~!ESw ^/N!njq3z+ oF>}x4U%N:=+9s%w%Hߔ>,'? ~_=1 ~7dg #DoY}=ws5jp h 7DnXErUg+~ GUͪ|[1 )?UB6gQUܵٗW~xW/HH{*Vqٻ` oes s_B';O;>Znp2sbb]J| DrÐdE'@Ήs~BhشWFwARHT .N%AxdWޝ!g#^qwdZAٱ'gy@ zSՐ:3-cmT`OOoa!պCڰޒ@jNLyt%Kk]u Ժ=ǀs<@፤;}\V^=N=P*^Ê3.T% a_Bj?̈́X. R&Nxk : 9rу8m{F{˟:bOU ^~Hdlι&𪴷o.Ny*qA&eͫ >F`rw wKiHȵp"䈓}@os<>݄ >}rڀ_ktw8f$i!$Lg>9.wNhPW,[Ţ/e|!^wҏ=~1$+ I<?fd9s?}?Iv!#yos A}.г vgq okW+=q' ct _ z:Z\mB_T#BBh[HY^,S9ą;Y ]oM`_z$i3+@F+gùY>R5RpS=N@ڢ!|:QܓZL6x#}V+[]`Hg7(_˾V891%L˘ Xww}>[[e> 1ޓD> i)oޔZnfEܗ #k/HfR@oQgxOi>1S;/%-e,;zE8!s9Zvpڗ8q-| U;wn{޸;xX"/e;_7w~?NN05G y[uQf?S3m%aFoZ{ϴ,F CӶMS<5X9o.PjGn4cYelAYQ#(b(f[e[e[ZZZ̒XKHD"ҡrK%T^ԋzQxG >>G+Ƭ1kGS+VVVDQiT?_ RB)W+녦BSMѯ-eRRRr]eWաP>i%X%KF(?)ZxtV(pq1WxKu117@QTF);MX ǜY|J/TUuk isY}D :@ ^_ΨS}[z")f^**ф_X!`{=X/}l/[V(P`7_:lb, FFF- P;^8(=_ZSmSmSUUUQ PM N9+JXEX6m|2eΩS;IV&7fPPP119^spSTa{1Bu%LrZNKEQQQm({=eLT P}>Y,t}t}t}Kt/*eU*bbbk'k'kc\KrgxVV[[[&&&'I>>>vvv{{{\\ܠAMJOb#Z*K'@q86؍R8iB{j~`ke]|FrQb}go cƠUY$; Lql^lgSl.c9nc=b!ա4dtm0 sq1g'ٙ_rutc+dDAp09T R Qn'ibE,"r HG>+auP (‘`C eFMB20+`K1ܤV{C,c #? %}$#I>nyNQ ƹl4WJՁ-Jr7K*\[nO .` <ϟSfLcˣ6ݏc)B 8h[8MVrWJsJYR6J+yUbt1m6o73tRKfYY~aeD9VaV9f@2jjj٫۫۫ۗؗؗH+JkIkIk)EJh~{3fp p-Ejjjj!WՉo2tE"]ѼּּuuuSJʣ PB@)4`jj;t{ߦ>I_]am^[ |V]ɰ~{N׹VJ˽/1{|iKeW^3Q ~XqZNvYeL5O2GMdzO,7LA~IG#6<>k7=>,_~DY·afkqJ[zf*v -@؍;ߴFc0H:V|WE6u.& z /Lu4wץZ v(f>1Dplӫz>/! np^K字\4o%'t?f'uF=f*PpaǸVN8Bil'8.O QJqչ޴0j,ق Fl`EFIl+0sθ@v%.7H)g؜\A`F<!~ 6Z^kqg{ v2o]D<$HnhsqNRKD~G~tGwtwX仓Eϋ:<>'~pŹ\q J_ai Ԙ[׭Cw[H'C=i3wr唖:tRur0X00uꗺQjT[6eWCGW A/[.mgMP-UE~/FrtV$B㸦bU|Mi,5tIΊ;/jhֿ;?+L C``þGi4[{;sN3+esʧJ ߯O\n)B\֭s-{ڧY9w&vXZu^asďv4<"271=ޯښCfHYvE={y #*+uqe7P|J}7 =xcySEq MI^mF "l7X_hgSԕi9->ȗڼ`pJ  V|{F h\0n͇}>|ӤO/RZ)((W\#Ũk./QhBCzA9*ł'A۠|uP \QCXam'̛Lfqgv6U-rx۲),Cm3̇Ϊ߸t+t+"44~^^zWxJ!{O;=b6|X~ѵޱ傏xwE[%?-bwꝆXrxKvfcQRY[2Gml&. c4b*83~JCuqHDBW.(&Lr(fFJcZk|4D:a?&PMh l;pN,p[-Sq*QuFi<+21_9'G/>_‘йjj8)9ríqOP aq^|( ڠ 0S1gTE"PXw@*R Ox?k $6MaS@@<+dunKd#˿ޤD(;>aG(_7r);eŕ?>jrmd_wIo䓧E|xs'ѝ7D.xۜ7|{=6)缣f=ԧFJ't({dW#)ܱi=m=m=MLΣv_LVH!yf$ERcSZ'ggg;W?D?;6mA [St5 tO>x\uh,קE"{<խJTgHe4<8K7(R0]UʢoƸj3>ؿ 2ɿ;;#)ڱ)ݖnKݝG_ z;_q%u]Y:fs{;v+. d֖tQKnRS|lmnm ϐ)uʺ_+Y;Lfz(B)Mit <)T@9MShMEGmrեXNYGOh@^$Q&b7." BߡPix"ZNc#(ԑ!p(O' C]Gx!jt$wnx8VhzԁX7J!=a * h Q*咂p#fFڀu؁Gj(ԓ@ATtb;h "0Aoq 2xpE.OOv_W"Mr}Zqv%j#O>.[\T)/}̝a *1 uJ0p?qu;q ؈K=aBG!@D`!F XF,`8w4ʘWb"x>lE* ϖ\ԗ'YP{S)g#/$GYfen&V~+5*nk `Ay':hS:Jl9&q/约i<6O1ui K%$V pAD~9?#(.a mnB!:)%Ruͧcc4s5ȭh %R'o(m]e1auOJ|bӀ'ю ?2eFh+gK!#SQW r sc۸):cα[{ N:Oa9˸cp)C؅y fH0`#V(.:_R8#Bt1iY\FwF/|Tu=S·s9sg8_ٷ ω|h6 z`2o5`ذ_s v}J؆cxmʀ4E-vy8g4;Ldp1uύ@_g!8(a<((Dj?hwN;3ZyVl^k&F:[XJ{p9!]I!@ ~_է(t|6/sFd$؝O淁W葀g@9gr^"P ?uh\ѐi{јNr{Y&GWYwd Qz!-mbyWOCI,ZiofM^:-է<;8o@qc1Cr3 K5p 5qP./΍՘'4XQWJv Ð4ðOǠЌF$+ $Gs$a }JJYq՝,>u As<5GսܢeED =Nhâm㢓JWjOeee'W=Հk5T(3^"Ju|[)ځAqcEXGQKJˎ8@XSȒքO;ocg!18hcn:a<ЌmA٠^֑?+pCGc/!!I4` n.YbFdv$CÔjg$uxJ&!U^N|[,dX͢l G恢F$Vp?cg ryv otJL6KuQ7`8&RZ:Ju3ӾZ!kwǍԆVTr=\OAX ւ@rGq8&fD} _P^(=؃=Α_g@OF\D,a#e1T dTǔ$@3P!CY\vbWʱfh_k2W1˅].'}JJlĞ.s)6F) 8x 3 簒C7A f C vTEG  ,;-j"I ?Jg (CÀ@da#)%c0І葊WEC \NbA0`pX` 2$|ɜJ˄l<.(*9" ;\a6M%ٹk~7Jg{-.yROf$JύY5c6%RC[qE=`,nrkÂ8  ;YPh uT>< Iػsۤ_b`Mv2TQNlC) f uU9o^O<9&1,"/.,=LLN,+c2 \wY; Mz03O{r` @ ";RQPK?aՄJsÞ̼_.4J{X"eI F|z`۬ɉz,uzqvݏq[+rq-cRMbo:FboSGmJfo |c$s(c۸DRA'[-:0 mtf%НiRCkDJh斤J5R./QB2^g̽~yN^AwT}b_˯:|]Sÿ?*2=b/P6n`%)$ly.]Q "4$!3֠| Y!Q9Q ÎwȇL'f_nxƗLRuo*.|}G mz?SؗL&SWeOv2yw_FAV pY̮5Ȭ|a!c'vEr;&CCvܳ__v%ڡ)YUya'VqX,gm|HWGЮpEI rR'; 3#, rTL4u[QG(nW2ʙ[قn`C2R փUP c3)LGX}Oe@c% RHG2EQ  F6P 5TӝATn(OUh%U/hZ8+%W@+"oAA{2'E&\2pEc -ι4JcMbLE J,@:#?J1rݐc#,-3o#6 t @x&,"^)8X֬,ȑ߰Z\kq]mv;([(bdDkAYvF30i;ǹ\#Z/fG+]rjr ԢrGZTB9USkڃHrͪ>rSMۼs(lߍqp ;{{<2̎(F6hafvg0&B?NwQ>m"w'arhؤ#,<Kz916K.$ 0GO D$"uNo9^ld6`6%"x6.: (][rnrnADAg 3 tP)&ԗllVIQ;!B hb wkUarX15x` *P _etG\ TOAT}}LۮGG.hں3_~{IeZJT<;Pu SXDٰ"[),6ba! |F.9IlP#t 9HZsQ*+SjaYCalE}2':BYE8ݏfKHuUկi*Cx؅ƵU+*W,U{v|C}r[˽+읣~:|0*zo:3RM6HPeP 5E]Il Q@t` -hš'B|Âg1AK8VSsSÆg޿>N屖l|{qX@qcD4LNJ,VsN5T`juV#/j:]nl؈ G&GXJ臂(W*NmxRCT*NPj)0 .e Tr(u$0W|)A~EB)f,hyߙn7}4hǭ[>b>MXl""NrotGWb l:)I "yb?ߖ,΋z1EPI8[$&DtꏊXCoA@IP/`WV+m=HG66`"h0lRf_oRfk <\.=vR|{Y;KK|*bE[EJa6['՟&#l@a[NmHAQ蠧m.a';ȺpYL"CHݨ88xa©%⾦$z)7ݘ>2NǯvTtTa(_g |b"yyqw1qq/;˱[3̨(h 8E5b/c32 3ᏼh  ñp;+B8taN&sմ w(BakW 7JicG+/4p:5K3:Q w4g߁G*! ~H$$}fs%A{,/{|4Zt/\U>9YOK%fool+ۃRa'iC 0Q,]uר''E ;wX֗{qa| PK(UPm7(qwbjCDgvאquI[Ϭ=r#,u1Y&4F|TηT74']k#}+w[KJ,!KAS{Vܻ-xBPyzO.{J ,PE$U7*1IG«[9j)oU,i,UЎ0|9H~`yYI^botUDnx`;Vmٴ\UbXoU(MR}dr+B[xl ׇ ŏ.IM=JaEO$;P}p | pE@NT*Օ;lnݗo-r]~ޢNLrKOLQBY 4TCblwiwt]r;9.]wj-r:a>s'PP(BY7֑UJ[ia! X7KgZs?8Sp*&i3x60`?dhW1Sn(#Qn^ҳk$?xzDs[㼊ԡڱn[,}rg}W''ߠ1E-aF]ơFffqڹi՞.u6x[[]9ջN0 }(G4oH"VX؂1|ds冪\0O H=pIv1ųu=I/[L.zeJk|TF,zc`u7~}@GCJc{qJ~rU|~Rt$˛d}U;X6Ms[V:Tb/+4`w]_3b6$#g)7G~Cvz6NY)Z?f)sVU҅FD TlRbD.ѨS7]v,706 -'$JǙ 9.m\ր*g cUߡpdx_M=:UJksvFebs/c} JQW8I}I j-0 H[t(;p)zmi-e\ fV]}.L2E*8j4`.k؊!F[<ÚilS]U5fS.6kclu幑۪ W 9nEm8{h] 莂 ntR:hޙ;)dWnU9/w_617~QP~ dTrW {4.wR[yY+0^O Y-l]m-j݃c\e>{RDLj{nZ`rks:,\4:@qz%)>,5,|tdMD 3x?H&lZǓΑz^T?a (QY"*!7VXKqlƽ!)b:KhT.qnI^U6(egQo?-Z#ܱNj{5} k*Lt)@~ +8&< Ӝ4?3lcn"y!exX 3 XN(?aD4x Sf 0`Z^WUo%ocE9؅\dee\2 i[FŷΤ8d@H6P #>$+<kg(1VU[dn!N+ LPէ?Χފn}SvzꓣlY EC3mmɸ<PABICC)11 QhM=C=}i}i}-,?Bf"#\eέVs6a7ɴ;C?} -U{^֜ pS?lt 3fO'dO*t!P^|5#HxE<;l0-o@!F{ܥx*sӻD7؄ FSŵxW:Gvo=U(?/˥紅ֱ% ymLg,\pr; JmeHK`ӸÈ ~8WnoߝQ$NFڍޙPn{=E,.vֺM멩\bY>X:]>A8(kͣvliUʍS,FU(BHQhSe9DNA ʠ<ᇒD&+ȃȋXEP64Sh'ϣpzn {3`[>(,u% ǿ6zdN_Fd r#1a>rn9b!pei2r W0jW1*ë1Uq`FA;t]@XW~97z!dH BUTG5g,(B'P a'\C ^`q^.62%vIBǐFP+߻* 1&u4a_]GJfƾM,[[.+XHިv4:WX.%ȱ^mH|:?J8: qkEHMRum7`m99n Paae s?ɎsFM{XQP9e7(OZAHWJ=jjTT +h<sgu76ةX05BP=%E^sEQi i{3H|iᆣR*hxcond l Y[)ze)ǒ%J/}NQ3}IHQ8Lf`oUS>2#w bhƚd 7XdLv=m.6QmjpGSOn0Vf6}# CTD{EQ`AsŀAC'x@pz:y5PJJ GO.fNqR<Twò_%;?T5Vp)fiU>9ӊ^i 3 4؎SMM[e:GCΤf(^xB06\&ΰ6ez;@:( x>ajx }| ]S\mBP[_r͓};0Ô7 ~+u9ݹ|qQ!wAFMS+'u^'k[O M\2k Zmr3)ʯݬ 'eO,{iRkecpi E2 w"T ! Ğs٬/ aXzK)V=x FRJ&ZC3"Ln8bPo~9wQ{+=VU5F=]b{inݜfוޛkXw46iSSIO8Lh]n.`"2moG\t_@?Xs/!iVSYm`ْЭ3YƆ4GWʏ-rN}sEoQ.~a &ێ>˄l\>Z"w&TPȳLY^-W ,Bv:*jm~6ӕ < S)UC/#f9\q"A#(v9)kwv HG ,@OKuEJ8~)<~ YϽ.:T`N:RJɩ]^Rƙ7TС s9OH0!3CPܡư St`-5vͺX42w?:n/?0]:IE6Vo}>* s莑/NZ+5,ks̑k]#7h%U!gze;T[Y:_a.iն4fGMO=7P.-E/q>|8sݞ9SwDYOHY}f+MJmlIN<>=c(C+tCx! 6 ~iX~;qMUuQYndB>pBa)| PN% {zZЇ z|xױWB'\2.h9^>'9_ȍB{8,N!.l@`=6b%f#:#FC/:NaFN"~# bGX h{)+ʩZsdXSr m)^j. [nRsK;RYs, %rt0 PC{ d&L 3WAƵUJ/yjBPhbu1< =uTթ+)ag0"Q]XA婼0uG^|NnKB7VHi `d!' B`VMX8}Yg0"Q =Y% WeWnε5pAq`B$;i& vSݦ:t$IUǒ1P 4O=IDXߙ넬STJxK4 ;˟ f9^"y@ Uȋl`;kbL܎[؂w R@$! /pX0x6WH :'B:}GA?Nt<)ʹO$ڴXˢ$=pn7@(5X{Tɤ[GY+&FƈOHf Q>uYUݳ*'v=dTeczyKX3kJEJ9l]Z:IjN."8HA:c8-G8LȂ?ρ8*p p3L޷ۚX2Vf5!Ǘler7U9 >DnW9;SGj$u԰[ͫק"GLyyig""ZD }{xшS9"X'ER?F =(zL 4q;_ +?RM,] 9; Rd5Wr1_G'p>0-+4sC.tP|PK%BH1\aA,0ͦtnA^gURjA*}J]b8vsp̃5N=INwfR&2]A ΢Ʋ9W\pnQm:FUuA0@Y7#N3O~m^vJD,6;6E?Pyn(KOmɝk`ͭ= /lb构M)(~ְL!_`E,6LdF3(lh./][`T*Bȡ BݑtT]92h%;uL-r }\ks|AQV3<~"7?Jb"Jqm[$6@؄HzF=aol<ONVc:NYp%:Dl5\$kwQcM \AY< \%.RU3RKUE7mA7.BT}D0" ƥW&MH+D vc̀#a-."_1TR]aNII173/VHh/eB9jw6X*ڱQqf׈y?6+Ʋ?B/\<2R4J)RRtċ{ƌ;.sHw(c#!"? \ P}O`a ` 8g&t@Cm9OA8?rkihHK]Io\Pbke>٫+gޘ^P9*G.l ;ЗE6jUTx eGVSqpϹNvd:tL$`?mŏF|ZC'P%籟#e?Dx{~I˿,.(V@،5iAEs- w6 S0-̪k"%%5-Z쯓&&i }2Wg];<Awf#`2̓'nP˯ꀂ g#2 o[`F.XP-+U}ib4Z)#x̥poMH!p5H08GPXYYU i4j)S:EvZr%d8[D܋\6֧`a¾aB4d=5=? X+6n[EFI={{#ZDF4tyrqNM@mvVag+#KVUeUK2#G; YƯ zXDNBwU4=G[ 2e*.3K@wr:7E2'0igkkX*ك }tK:zJl:EI{,ȅaB&)I! tpE9#9Y\Cm)Px?!֚qZ~K]^}T =ͅJ)\e` G6p h8CWwOy;gPh,V1m@ JB ;ΚQС" ]h7}"8yc_"D4GMЃC: NoGATcWQ ?բJVZQ˙_ 0xX{C#RiM.xv5#\5æRMk5kM M=el^ʴ}n2ZAAӋ5,3ixr+QM{Zfe/<)&RԝlS6[iRn=jǺ es|JiX.+D1I#vYwGg@5.4" xO˩y1J^閽1=# ׼adM[a_e9(*d9894ugkXK#QrB!l*p;uHBRZg晃r5\{@.PA xPDYOVrcsy9|6+vu HEdxѓ̶QK bڱ\״#kܟUZㆌ1>j~\R`ܝLk܎mlS3bj!B jopom+4j #x8+>D+LbSY7N PҹOq0i  _]ǜF! <=lJT n Q"ȴ9r@ȧ-,$=|^A jx QN{i#]!~HG4A S} Z,BN'/ے$]U5Vbe E` ?aAkt l0 n@+? B w vr檫<'3ZS?#4|6)\iI 3rBRbc$P;F5ݸ!CE'/ u^KzX1bVŬzUW ])01T]RUjx4Z{΋SG?l܋{GwoxZ+ϯ5~5UWBχч~O3 9a2Bq5ґײn6[ 3eGr%`g k9iW4U gf<E= EK"9}p/aSmPnV5$S8Hun#(rHGcֆiV& Mh@75y/LjG >p9#&'T J-L 7^La'X !e +P2p|Hk8"0 {BvVKg%-Q~.@ mְBp ḇHB}B p 6a Ȁ 6=D2>@iUȝ :zf~<)/a\eЌ̀ 9|4+ҹ+A̗vA.TI.cdjh?,f=w0d h+؂nTbLhn?boQ̖tK\u B>d7ו*RPv9flpM`7Oze͏3r%걱*$#Y_!)QY\F=\Aj9lc!G>f GKPEQ`h'bŹŚqy\"U%1U̴N*znB암TǤՊȳ̏{I7q1K -} 2u (,aaHE-t=H;XGq  8 $778aB& 0#ۙmX(C03{Vb,=ؼZeldj1-Ym >k^ïAPHU<ŶatJ..eſퟚ# BCCCo߂+ jXji#έze CJ(R;$[rॼݦ>"eC>dH7߀~~SI00 Ҭ9Q٣ U/-fRWDtnacH/{*sЖ}dYQ)Բ.փF5Z<@U=uKNXtY3ĜOv>SfՓ\ܴ=g.qi7.3_Dvd-ktB Y&T7fX=ApilaUe}o"n"y #Vαi~wdf幛hW.MwQ Q,CFagw7톗I9%tJD'L;3Dvº1|hNx,G+-`梸\eEhnTV+Y0cW8 4h &d R!B:Z> $`t? luB"[™^ږVl(2vLZgѰ;-Ba-v"1gZˤ Lǖʿ,[̀nt$D\1q4p;pъ, tHD( 9'83Qe`vدĖ m}^]aw7krT%<5cےY8c#{%\C>Iȗ PբiCSnb+mB:c)[ /䃟~ [lFw`%R,yrΈE2a.($#/8D԰<" Oᐠ9))U@ђv=E2䘯1[r)iZ277QrB `yXO.eo.m+J_SoSvU4{ԙRxT!sINzJWX ׏oʿdXdIYnkzmI/ؑEF;mc˔֪L}Ƕ*RKG՝ښVeղV9-֒|" Vv+dl2fN0mj zqxƃriu@(+Jj$0\28 -

~!~7h pdk} , !Wmz2 k,eeHn^CAT~Z{-yyx~o5SRCw(g58U,'ϴm)x/5嬗;CZ7[Rj%ɋILm KX+ y/AžC6peq亓Uc)SSvq12$gp <'+v`$ee6]q-JY\=.na>6c%},q.Qq\9!K}<;4|m@|9/C>g *XaD8`F~X TC H8n+>xb(!C W o 31-N.8Š,D[4g5\Ȅ߲Kj{̤¤%+Svg,<0g*WG'bG$p2pґL*-|UKRWy=a Fe,7lc ]Y~KN}ct1԰7is tB _F<{ⅫJ;y6I,Q 5Ba~=,k x~MckTتݮ,B.27E]ߴD1/MĤSVo,9ϣ?Si>`&c*L["Op茦IȅyoWP}(Ai8w^ 5 43Qiລ5VBJnC]>h˕ %}HHBRPUt#dߊ8$6`JNIG(Q&sE2)xzF/qN,?*2)>E:joda@E!(`C JF€,CϝѰߊ#р u2+Mx8֖YSW앭 pzFe[cskvzD͸n$(9NS p=wBJ)Jo[vӒ.:1K1*R=gT˘Mac&Z>̒}YX.m%:+0 _RE`hhؑ4Xn@ c@1+i!U(U;֑gE\ˑ5C'̖BGa@XPЖ]QuԹOLE/6~PuQۈW@yUBMv0 (Ɗn-(a6(&2OTq=BPSv7>$PࡆnVCcBs \ AmVP Mӕ8Beٗ?^̃r.fy#[\4U=C\md[ȃX_Zt-nYWV|'f.Etj ؠas1AI(/)f>\ G?w2ͤͶ<-Q{GmvD~+Тu00lMhhڸvۦuM,]Oz;k|Vn,lCg4`Yg([9Mr\>re<J\b/eI]ROn'|p(ȯ0dp\Y:}iIt'u9RL9,4jY&"c |dPlGPX:̲䜑$ H %D% JP@ JFD9<;cI{k:TWS$RԢ ?a! W|.&P7^o}$BMPL?$G\gd،*V%+ld ]Pq;"T:9*pp`O8Ec+Sg|-1.x:c 6s&~sLRԻ4׾\CswPgE+Z*ZD?#J!]1"E'G6qO/;:ly}Z%\ѓJ\lGڰ[%s̚E躌vK;Q sרbݰ '(grPy`CY\IFq \\e[-ZR>NdZdHwi˵,NfGYFn$kOk沸lVS^ ¿?f`mիk]n|׶܇WDS검L3VFQ7ԡOs\`-*ДZV!Q^pR^4>;|aCfj(xYc X^O.`ADX搏!(k}gEaזWuC+/˄hE8]d)a ʰ;=,kv& wKݿ"'pF0]һwi񑉏L4xx[O}ENbͦޒ^\u%]|h|]YgbԋiAmT}3=Q-z8]̿MEG?;yC#N<߬nUM - ;#J,?tr o-,QKfF;ëÍtc(P^bjhfpq|Cc}#P/2UYQlɁ|KK0v2 U4_E<8IܡwH!y|0^s"D8Nq',L$x[TS^iӊ-̑Y b8z S^:}(0'Ȓ/y!TF):MC'li /6 F_NkDDh(f#6w[VX&ڈOd]횝]9g#4;)^+Edg9d3쿫X\DC$g'pR7=dN7 B8v.N`܃ &B<Q!|xɨ}`Y8E I98qBN-j$4S;#rEȭ*UWcn3Udl}7MM>iz:kBվ^x/U2S/fw7H36~0ڧv CK\UQiVͻq:ޠR-a5F$yF/2Xq~#Q+dk zH;)7-㮹CR}cř)Њ2h|mduR_T.@%R<+stT(eUeZVGPJ8A 0z !B0P.,!A8(b #s`|V#3u'`~gvԅnNnsQIkX/+~ h]OEjqHQN[F!K' 9h'J P7=8[fn2]~IVk/DŭeZ}i mAZe7<+@ v?OCu.Ds/V׫W-[j95Ect6wuuޯ=~#wW6ܰH |qTwvW•W.~H밙Oj+Iw8YYN\8f>/o8RZ;\+P2ȍ&N]~N4EW)-d1FJxt^8l@Gb)ʈJrx^" t4?0t﹛ +㲤*w8-G-4T<&ZNlMY~%S'\GE'C`'(YT(jM-TOsm&CAnHf's$p M? hYP@QzPI%!z_荆/Lb`PH(w!1##OO4.rG8uE-d!N$Lt4|cJ-üMRi*籀&peng^  ({cÎ;&fy,{ \=whVL;ysFɫ ~D! +EN2#zq;%Hr9ejȽreҴf]֕1.٦nQZ֑.scxkgX % 7|s9E}_(.8)[|RV)zQYtɑGʷ{Nɷ~3v=; rW!~Qzm=ɨuйOxdlATA3V[o<:Yެj|?\kT QWdK[YFL~ Itp& oʗ)ަVvQ}pCVOe ڥjjllW#&mj\H'?#eg9eG@ۦ$g }`/COvQMj[cQ62*O)LuH&rLH/gH"X)F4?j%2D"Kg3۩M6N*lf,6(B]eJ2D{U>PI&ZX]#s.49C~@?5ORQRc2M( X(_Qy\-+픦2Q~o#_=E+͜g1ƙ?V>mry! >a!E8#ڗd[qF.:7|HzXMۖ+ dW)!_e;d T6lUrM֦7l"'åSn!uA7d/zȚ;zAYa./Eu%lYi/X6̅Aim5%pȗmmX? rڄ70I,ֲMɴƎ?#p/>\B ck &&lێSa ,'ﴏ-h!^b:_[kouSn5bv:`N.1<⢸(^W_)N 5ꏯ]w_mjtmD65v3t,^7#6вɚԷk(kŻp_rfd*"B{WΩ-n{)j6ۭ_IoLX*f rDeB+,|/)RR>\  J 2CWfjcIuZẛhzK7K˛~v)ݕƷX έg}ӢSky3/UI,ub3X׳6Cv(n9/)2g.҆tg}3M[0A /1țgNIǎg˂{"op]I$;AD&$Nn28}SF:c?W#挼UKTE.bh禚δ$/L|B 3Ąخ1|DPjXq+ a1^^* -ȫƺs_{.<#q3_Ej[ozc\8u4ƪ}T+o= Qg6̼^Uu]f3O?䖉u.EqgGثŴ)XicvV}yc?%mR&UF*9?bg꭭R&(͝qyCr%R.kyxH^)[&\q% C2u4*E=N_MOnշh/9&96,:=*U<[Ш J~>r\_)YNA,d#ϋ+б8@>W%T| :ZK&VP)E'c,cRP~*L|Fo7Q̐eM+\ It9SYf 'qeg:xN:=t utw&vʸ'viXXsļF1&>|+3Lqz7w\֠a/yrM䰨&{gcZf 79JqYYv_;B‹>kk($'8.åJ60;D$o#<9hAʸ KG1MlSE7-S.q6<\FY5L퐽lb y^va (gAܧrwhUR8Vm%%RYߘ5:|òǧMlGvG3N?ktp1/~)|\rLRu’m/۫*ԮƋ;-cl_lQF"G×Gֶi%zGɡ+†QQi^ҎbVƌs3.eHo>cV:Ikb4_lH;3<;<;|+V.1Yh]㼑)z7R{rɶ%8;Kn2bwLtsؔfLvgFQ5Z+bRV}g|]eJ˥J~3(s,pTZY}*S)o)sD[>)W&W_#M_ty'a]qإI!*^޻1ǰks ɵF>_!b=/Rc}jLH 4$+x4üz΢Y󂪈hvg '=yȘ;Qkw"A#Xߘ7.F[фF9 Z+ YD^3 *Oe[b/nm{ ݿxBޫŊzLQ"̽'VyZLŊ.L6㹠>nvADHy3h+E.YJ:I{.4'j?jAAӬg85K%MLݥn]!ξta7tՆhG*?޾'xou:8/Qꩋ'KZO)ZC35{[^2;n/ɷk©W1bPVp&[ŕpul}OW2S.w7&XC6ܓ$d];Q"2Xx ]AYa{||ԦBЋ[!H5D9+{?19kH${{wƺ0lc+]n4tq.1vQGk e{j8D}o/7Gh#_ 4?•h$Q|W\e00OAgRA<, d|_޳/ܪNN^p=էfi_kKX]b*vћ6'bj fY|ýNQ[<ċkʓalf in2sH|!`-T%,K5e%M+#sˉ *L\]iAo;>;{xìz*[Y'Ex܅C_1@VV۟! hOAEQGIW.k̈́ißׇ3A.?ċLjrH3qDr[>1) WD@:WծO0*#,NL%"(%dKPc>MȖ$jc)u,׮btH 6ߗ1?:t|1:oFY=IRbb :69좍G)o LؑkM bzZ9 ,z*lv`;oIο+\r)QƷ_39Fe|sJ}7[ћM&"c&-fV/XjR\;Q4%ӓb]#cCoqlNžKN'.nYZ3##U꽵bSNb4S㚓 "Ftc 2h$26).nl8/Fn`C%!(X|,d dWْtN~.(-F2O+3WlTJ{yRi^rzGF Jqܲ2Ӓ?8凖#Sϖg杒'mmvF.Yrc5,4iE>CI3k/T7*(o˹la'"IJ0&/0"^DWz蔥Հ? *~Vk؉.%p ;~ y4X7\IUj8 hdߦgEo[YlT()&[[ef *ds s&m-ƀގX0wa˛g(_[jCYٛ8E#[CD5QXkHDђxJS^-W^qGD#Ғ6E9Mnc?([sZZD"+/rSsW\Uȳ^ ͟:N8\GgJř>M+ Z>!{Қa\,8(TC3'2OH!PHTaN$AT6ŹiR#1ag%{bFXnk:Ly^vNHAm7& W[4'WޕI_r_*-)Cʋy8:WcCk6+#S386& QF*<.qRa0'LI&:64|xQʔee,%-{E'e<|[q>v,'[YEYEMՕ;8*Rd(kT#~D-muqgS=1Eb2o/m:Ჭw5OJ)ؿ.c\f7";驙c?ɫ敶JyJc(Sll?519S-:֏aEb'SiNc˧"2C&QO93Z1z_,ukc֡ޫZV; #saF7q(FڳAOGcO+IYl`8&.P@(%cJ-TWCgl~55i >?qo򳀊T_g8Ùlu |DL\Z 1ݚk*]YZ/95b>Wyb{Xa38o~k1)c9ӌTt)c(d{PW *YM+{*8ט) 6vYo̐YSh$k4rV,b8^ w/޶aPDyAuġbɷd[̰mFwVրn5:V}S.SX<<\B (η,!Јp)L?\¬&{'oЛӆ/üBPu?L\⪜L:U]]B0!'?yQ4Ma¾㮻ӭ]2n7lwԗir )9&C-Nq;% kÎ\䖈-`Tdklߋf- rbЩMi@,K"uNN_T.ȩFzigGɞ+3O:Jd5،2%Wf}mZ}/nwZrji+[ZƴwmVA>wwiek1^5y)]e?wWAe'_nH)Cw_nl~[[ hPx_5ƩOgqIUZUf@9,;Qe:ۢ(a,kH&܄iGA9J*`R8XV]= 1@ECE ZӋt\ ?aV? #DC91T 3/~d*?~lC.A JY&!w5$ pI ,RI$['Cھ*?)&/+XFeKYQBIxZf;XW`ճb]apjvtFDvE>ɟd/zl텺j2glR.HHsfҏӡY^蜭g>VYM8vc>+SHXW҆gT{,5ѶUGoοvkeqWnS2y1DpZOk驩+}tآPF?] S^aKM쏏@v:Iu)*tH:Ih+d˃`Bf ,@l/&=C"W;$la9_Dc A9?Ǣv8v0RZ)18 >S;^6^;^.R>VK9jٟsLWHk6BY}tCvF-\_ ; rJWoOӏXS=Rb:dRv#6܌Dqx2wsܸr\?Z'/'͵$S-j%;&eq̕E2bݖYPCg0hnwZy.B!AU6)(D%1[u;\c]"Vx[)ןRJKy}BQ9:픧ݕ⌨9!=G|=e;+|ݻs8sb[ԇ7 d<_1OgZxJOxTTe.R@yy^nc|G`\(r(P,T|R[Fl |2ɣ% xHCȗv Q>l,2$sy%<2WH)fRwoyRFE82D5:6`ʇɥ/Q#s\g~j55ZI,)?߉o6z|Sz(e$q7l%}^֚x3*#e)s#4^\ wbKrQWQbn}$XOɖ4eѹDI܅ߚAST*@ ܁>s5qj-'~~$7Ol_ZwyӁW4 {N\+>#*8(UmP8Ee &P)|+j;k7'r-*DS Jڳ̜ޮ!r 5GIx:T3TJl[PJXc-+B>&QJbHi䑏 /"-༿7{y>Y׬kֵzX=/}%wH jЅ">B`5Y7DVBbF~2&+sO|f4⎪jik#D+%w {J*1 TDSQ I'wΦFS*DSB)+%$sԀo!FI>,v]b@4QyѲFGtDYAl\/&"'Cz6pRlH/1c EOۺ"{gTNF ðvjJUqr|f8H9N= 1 7F*LH "dRI˫ܔ7(Md>1iQR@-YI.46QV']<3LgI v} a8 sيܲ;dne ɕaRC5[dwG gq%p_2Q9ퟁ /Jݭwe'RGtg*)ub9=V5}pKAzSt[ܢ4);i\,Ţ(*ÃA$D+nxטOɭYԯWAo9ya?۴ڧ꣊^6 C-[V=O(z/&vG<./9]#dRWEcyM,e뢢GM (2 c+؄ I4zЌLuY'qA͸EɄS"L#yX#m*Ag}_fP\t売)See'`~#j<$dy+ Բ9th B$y;(N̒ H,.ϓy "Js_7d̒.1Y4Չ֧J 1Vy. e$COOTb(Z) %_.ZQAQZr$ | a8d1@-0NDzVLP^*=yN(.:)'ɡ^h<&ПvB#(qkЌ!pڲIZQe%#d_#)sLQzEsqh' )&\214!&Q?B M!`N ]XK,~q G~?pESZh)'S ZԦ7bhd~Ww9Y.;β3ooMlw]qT.VЂ 0Ž=2܂G Պj)fg=;J%gQ6lN3Z!ByK\]{r0=NmExF4R5Ԣ@b9<'rxWl"7%{뉽BR ؖ)DB.Q. $&1 L>&o&dUr5 Є&+JYLTĻz=L;8_pP+E]EWOMiGej*!3]4[D k24-L؇zToebPԌA9]yl!/i4i*RiB_$S&ʛ|'rO]LSgU6i9NK,g"foc8e ^Pbx ծu6Zo+G b򸃋(F8 xB :ğOiHr!uVAQaλSmT X笏P-DMwg{hOK(qUVqupݕʫJ^, VɱkcUjCb"vp] Ҟ1> T5VFZ>}F3{;#OLPGNS碨o׬fOs("7K9WrSaV5^5w;JYcu.;Υ}ݽ>9\D&~v*it3;^ov2=8|+hn섘%yYN}Tw&ul;Fn.E]1xF)/6"= ,+NlmJY:պ)yEcb) -*= vtlH|+aG 89K~_3?X:]ByaBH4TF4G(}aD2i5~fMDEA\ !J2E'F)}hfLQQ|-Xmaa%0g#h4,#Xn_J+WQv%_i *:A=]=#u9. (O^o|vֻ5E0+sle1]͜aqyo]TZԘ#\b|Aۤ ޤ?e3ŗ6&hVλ8۬,K=f? [ ޑQ͢l&U'\v'jJ/2aI$!DI58ME‹?DQ`t-GZoS EKP(rtNͽͽ wfy w*\xe㕍tm6=ȷ"*\?!b*VJT}}}Rx]eqY\~YdnS۔Veke:PRK.U*QDvG/j; cqg%Z2}AK'W+oߺ^>ٰjVO\|^`Q<=KMENlci4wItr,t,t, z=,'ɩS. ?~:4+Y, Q{ZsUƾ-o3Q+&o>!^+˭x,eCjJl$!%zuAsiүuWGgLJ\IiV)nxZwSY5"~5x\ +rm+'Yow{oh\d<9>+舟{ uCM6.CiOAln(*)/lm񈕔S,gT)K&:S* eb'"J37&Vgh]7+хⶫ[Ƽd7ݺiv{?;fr-\s7]䈈Ԏi}Y.{B7_qxJa\5Ws$RRL#X5K)+KSrgȆ|}¿T~c|;FG(1 [)Wϯ=y;.{5Lg|zzTFg""D𨸗c4(/-8TT~<-A)e.1~1כՃk/>^sEդ2aCᖒPPMBY1$aJ0k4),rtN̬h\-V1~PA- 3Aޱ"~#ZܒE׸41ܲn'eVӏ"NLw$UJ .BppcD!-IǠ=`Q|%ꖨ+eȯErltWVFiW^V9ߟ[?O,O{Yq8"ZyMNsPd^:{{{{$&IJR8r>|}}}HCymQG}9 o yu X{ILC \~0K%^2Qkfg]uEKP ^wmLWvf'6R]K$wY#֐L b<1Px"N^f_۲|QPk9$y]=N\cwG 5z\hҋNms)vjY[PcECiUYagpw z^Y)FPӟ<_^OSvPQQ/1A :Fh+j>%k(M7Uuqȍw ek5sNԺkPMV--픾?z+)gug5fO=_?^ fi&ICLf6Y8#>jxNSN < *НC`6J.CE)!!9"JstyOբ* &-׸GGOSdPHS8q ptak DS`rȗGe,V+]^^% B,Y:Ycs]/>OItȪFsj{2; Y9cI¨dP։eC,>ӂCW_1?^{22SJK-XEs:_n AwVm\טOEfyf5}p譍:q[z9X_*/+^>(/Qn=?cnmr\b>KCJ ~X*'wM5gv}eTkR)GqN拱"v%Drf9C)42o?i[ZԹVJPQgߕ}ed+DMsNPpࠬ?f}`+v 1͢j}q–g)nZ;9系v>Y4\|?wX{8EQj2a6ӂzGiQU[yBmWBjQE},3FKR.2YSEgR0.|Hm"@VxY'rI'F]JBlA ivUݔƢ`ƉJ2:bxhJ9kIN*̑Ƞ&2e:T'#^Vb$WYl-yWyUӋN/:怛n~+V~͊7+*KR9Vc6n+OvxCRV[RWԵYy_~iyyy_ ZC_4鵹^wdEYQVvݏ>6[l}pSL5Ƙ1gL5O^lx}y+׈ʧ5R[þC#ڇwblfub;o\TԄW_JeS_Bb:Y[esOz]j%M}lcc<~&5czWȒϋT92-pQ|9K{c H7̫(d:R̡:թO]6`YAS`uX-z˥l/Ӌ-d0uUЖhcc\ _+rl)_<˃69s2窫rԼ.&(u%*mQ^{׶x(k w/]XebiギxTaɢ~ }++qW٠] gauvB|(h}/cJAhS1떹AYm [3[1cJom>K+V5?۹Njc%)Ab$XAڊIL;P^feJ]E)e Y A}ʉ~2TB 1rQA)q3NP 저3Aa(=e>H~kδkM"Z-W%l'HBHizIG2Y,ްp]9G0D1EN փG/siZvqRv1.m9X뷉EeOmg15{2qTeZ&x@n+"Xӕ}r|<\ Zk~+[_Ӎ qJclRQ-zlm^A{~ uVF%<*d`LmXd/kkJhd(œ kV!k :*ˡ77&x])u;ZG(E5T^K,\*eM"t-9rX%V^{xM CmyK^=pܧܧܧ#J $oɋ`umjf͍#prNySGQU,lشa{枱_(ˢh+ڈ(_pZMs\t3"˳}R۶i}EGG/){v;+,o/οP<|(m!/eZUvUǘ\I)'o\E,K323`ŮȒJ^(ysss1WjNI:$ukq [dl-m6߇Bg&;vtNpf$# "@LmM;6¹uΊP&EFig>_~\ԠVcT2'9O(܁i)vc@b,2~$~H$xTF%&h/\qq2ڌ&<|!iƁF+:R9לf?rrr] L OHI{,(KjfzmK)#X dyUMBoܦAlDߐ "^9 s}KQkִIje[n\Qy;'?a䥔fo}+?v7Zk(vJxj6("YDW 1Zωݥo2@jW"I~(]G84ŷf+sSpΖujUWs73lyq+/#[4Uܢ5b\#vF{Uٻ'Jr+hZM{J4{ȴ5ħTFL-^6!&tUs+ |ҁe$_{L.农/O0EQ'$y1͈%Ԁ놂X@\'XqJC1֪,  gm {|\K"×ĉRWP9, l?'K}"KwƗ}&Hx̵o2H٭,4l!۞|>GQ'xֻ(l玛Y˲f*ߒWO_.dUGۤv8O%M=6!coO,Wƾ.tjP2kGr3EEtShOj7񟡒ӻ~ J͐A^[.|Cg3`~  S"Q$RZh-.ʿm?wݾ;}WSUȓU(7'uί⟊/*%/ vy"3t̔\e\sԸeQ75W̚N}~N}[&ڥ;s}eg1gVYhtщF'fzs9Ž›W*U=G 9r]NR'W^9/ ʿ\ bÎ @3+e*!&R+X&7?UXr/sP' I=+;ܤ$^%1&rd-q3O]}6Mhn[2!B|$.Q[L{#?=Y!E-ozGYhf-SIWu 6^K9!n,sL_G.w>Q0ԟGYDc]hԗm̖q>Q[yhg֖9~#z~]j0s5Xo7C|w_:ɉ4oտC??o t}VdžF!Ѣx[9VihZbXk\n-9BZ|?_WR5E/Z)˩o`sQz^. 5Ytᠴ*5&4TE-Q*TDmE j\xT,"-5xI( nX$Cark((҅ 6%8K2nz`aN'ˢM|;yqzڰ%im4~QQ7hhIԢoDeц DB]z2oze2T^P΋ żVxG>ފ]\l OJf1W;^G8/ƅ aOؓU`ͰQݬNJSok󑘔;z΁q+-S;7xº%V)DCd*xQqT$ke3|yΩ ܈egGgI+eSa`o>=,XǨqO]M=yu2fz~OMOo(qJR]ΐ\LXwWe!eѾì?HX^HIuSx 0+Kd?kL^ӼݎAM푯Ex"\Ӳ3}y:ZA&tz!_}@EY;#)21n2Ƥ"@|Ecw V1JM}M:vz~ZTO50&(fe2=R^-x_ӽHy(+z)Fv}Ǔ2G90y{n߅\*w+\9y٩^2Er]{C˱?$֋#uRu>hrD4ECK 'PtR:7wd3߷YSkqʸo tپoHU6W{.Nj:"<zͣW.OnՌGH}*7lӔ}K޲ YC[ K<[f6jJ3S%| ObNQ[Ԓkj]2S,:`)_F*ޗKѝw GVr!3EEٔ>5A8& )^f(ꈇD1x^N ?JHxAQ*(&k?%T4ew:L]Wҧ*UG"Ghh)"6l؈ "!OWb)]4L+Y\e>iN4C;@jPHP-tc ԰K/ɳtJYֳA "^u6_{O5o-V.}hঢ8eVSYR^Vj7A>5$81NQ"2 ^9bnhGo3I]eMG/@/WKۯI$1ske˨H%jZTUDSu0x˜Ly1(rAUT>u)fflR. jDu. Jf.΢|)%6uzR-!(Z ޢ;!W#E?1'Q(k& O"qrƅ0(("dbF(oȿOh|`ь^ x&d1.dzq۴b SMwZ;zv~B&ēlB`jRbTDO%"J)RH/SȩqCS߱rdkfX YN{i:5mOjn(?:&PXEe_Y+0Q9'zoqp^Cᄑ|(OHؕ ,1r\DS1^tsO؈" e )3R|@vox'^@/J2+f_?X L!8qw?9ͩ/d p(+x S-{ xu2;`Kg+K.MhAss7H$hAsg 9NT"0x'yX֓ٸDxʔ"B㲼(Se~[<)'(*>SɃylX `:DRPYr2y^䩀bpUQC"h%HÏ;?B\ #_`NjMz`K6Y@~?Z.PlxPbQ BŤl@n<10R;_½(E)g% oM+C#o.s_ZP_g~3 5m`?p?ZgP)@Ca3xJraP*pa,4<8_a׏`JRGp "*.T!]#Y6DYa#K\A$Rb(M/$(NshP3LfǸCE\ ht\d?z9.6J-zP`*N([rmJ,9GĎKqF|'pz@=PH_(/ă] w!(d| \G1GYQV=n 6*^\0?Ə@ ߂@`"bt 62R~s((H5h"gVObvVVo-ΊGD3te|JJ.E2UB.ij"EU*)U5zbFS.bu QYgw\fG7'q[$LR/+\m͢(DW?k%tu<)"t9\4w V"D3x4!I:׸N>KGGK#09FI¸ z,aS Ey$/oW/S6x/ߙ5{05M>^:%:C"%'@&Ga%|D`9T7TSbTm<\.N4@KŅ'((J5FвE <<8QBÅidI64h% !zqXuFc2WҍLge1yW,yE(C<6S\Ôoi"IdEybH"* !qt:H2XJ('"/ɿVDH[HDA# B 'Jc C}%B<o]E좋xqH6#V4{dq< "P$IN9R0)?s ь,-YJW+#&ʹVUZ~HFWfw~"*y)cXpsyR?dek_\Cܲ,nOJ֐gkf(!ƉVuzVwHL9:2cqmGO+!9±'N3awy*d6;4ʌԞ+>?cKzC~ -ԏUgj>Ո҅fՑxLyLyl,=jm5I)/0FdHc1A^>%aR\[ڧZgpwww $h ]A܂ 0n%c: {y驮:u{-?9~> Prk,XNc,:P7#a(L })>)&Ri=hx_B)a›a%ec$ ̼M#Cy*ُ4&Nw@Uuh{H#\ThuCPnIm&բ47Q3.dx e[8VL`A& ;L KtȂT 9"eDKRw?8+(@}Gx#3[ ?Xg3~x[?.!nd(^3LqJS;@ih9}T).Z@ RUF-uiU,dF^cT"+`# yQG%Ex>T)4J@**+Q?h*mjΑAx,qR+üm$5E2} m1[ \tUmtZ똒|Y2Q g)[c-D!BlF*Ƚ\EIX" Y@ H8.mdC2m/ j̷ aї5T'Ki/6X_mLK=cc1=b >3n-}s]Jid(KYk8Րь8  ,Q}`4*%E@N^pQnehK02C١CWDmh6Xu7b-DI}I @^a/w&pΆ$MXHg?uՇj~#YB=\)ou}EuI( OڋS?ybߴRc 5}r-}KGeythYI3t%M 3~<ĘJr{)X_ȕE=ݔi:5/b#@WHp? 1L|ՈmM8$R j'M<CvF l`"2rsSmi#ظ "D2!F㼑nF90^P0۹ۿ|t6vsmjiTyeƳl/Qw𗓫HLP퐊rnk1aoŒ}'K{y f 䧤{!JL/|1uhB +⟦6F)T̔ _=~e {%3Wݬ%7ۉJ) a*RJ^L)ڗ͡xw R_8z'˔$FK37;_}xo`4g2:hf" &.ɯ\y7z ũ^t!k9yF :B/: dаeB&dtN^驧S.O<墖F-Zh؍8fSA-b(Ƈ5888Zj:VXcJ"yuh$8b%2 ^2hPuU5>oҐՃ ^ț"'uKWᱧR{D#u,n¿~ x 87L?~kh[c654s7h}yQY[YnZY+1,49/S=@]I(|<3Chhe"-9{_XZM> F|omD])F4TLO9fZFP |ܕDLTtQsEE\C1ب 6X<+D!`ha:ԍTBe\|@8B`m,T1a1+YeI;"8z+זS al+`Zvn4<,uۑ(P U=wh*mPc==Z/mdRQLԬ;23rmpz+ m|F|LƙFK#-g0&SjiIhN[.B0|8L(2p!ƒX< Ȍx t0|A @cW ɼN88qoXa;tNn` Xh~M=An(O>"&#waBwTCQe\ 5dNqc;ʹd !`:} 0E{SٔdR}Jq.sH\:mw :G7b)ˉ GhV)Փ/'G6uwפ.uH<?KɰQ?~mʯr+!Ve]mz(ȱ{{v7b?~cnU3߫`SqzWukfTnyZ+-ܳ~M雼,0S7*"* DRt6֗5 KT5iH$B;uGM+1r[bK94DV_AhKͨIRG[ޞLXʉ12P:%C5<:Mtv4"7K/A~H;C49t>!S:F%e|!ʻY"E" 91Pϧ4 uGwt$JO:}c؇*6جbA cAB}@ 1i"}XHf#qyoUdْ<)5g5kJĚ.m#gE }bt>nuuߐK/vfK"er}))i,ya"xBZk:NFoO=Kr4UgpaN/.tg h:'^xZGk?^LJunuw)NRڤ;8+eoP K `T6@pX{hl,ܧ_?B@\NTɭ;?;rʄk-5h:CA%Q(MvдWkm⾎-"y`qWF{NT(rJ$@ h(vg@G'261נTg'O?0ׯ^755mmmP4eTPq32F?miOvMn7quu0ˌe'OZl&}1Oi{FyCħ '>MzziCe-h-h)$mlXw/()_WjM/iPk';0N`Gʑ:Qv+<GE-i4z޼7v\Kss(=JVluwwv&5Nh*5ᎅFg勤ڏ+>)437a3l7ⲼrwhQkhz$>Ű Qݣj896f3d=!#‘xL.2fSvX: ſ?(7$O2Jq>2NfDa=vPuZA:cM0Qq8KoI&HEJ{TuZmK*H HPb(tDGȈF4G~ݸ[޻vڽkW^]zuZ^-V(E"[[[P C.J:uN߬o7Xbva7ᡇOOOqws|"5ޓSݩTROݡӎiԞjOm9"ӈ'|窞4>ݠ Zr WÆ^XQ(7b+/6jh(mE?aX Ld?r D_$`l8`Cp āl<F`{\ [_ ى8A J#kmgdmMԙ\2uQ鷉@g)W9 >(UJ1Ux3oC"g` "٥R%l^?5/PhM!Q +|Fu鸂;U@ \FnEy6"!Bx:k< }LJS Cx`T}D؎'x@3q )錧5~G45s@51Øᯂ38khPvo(,] S@ŀD~ 4 A)"s2\HF*Q3KT0Π4.!1P (@KS4EӌY?vd͜rySc1A\%12ncjhn=niݒJ-%DqGeGu\U$W"LLMۭ0eHyK---11j5A"3j>>Lhz+9=5C(vb9\B0TSa6WTJ[wC <Șqşgn۟~4!"rǸ ~WF4BaC7n͙Ԙ?2fsxF4:&2\ Ɲ##FlpMo^@7Y0 } q4E_y87c(:` @*^皣VI'7T+Vp`]@դE2'Mfч|g3GPm>>噻lztrʇdտ'P)M5M 0ͧXNC`xTC0}:X G >ڟ t\}3l0 C DE*_1 HCw2 =HC -a|d O5W5A.jS`?9bl?{EԅT8q q18- Qz54|B*;TvqD` f ~30b1`)ct vaj3BKȊ\k J2뼕Or^O3>1IR]MKK啰|MΰD(Hb.=[s_e0_a b6Rnh^E<'uxP?$a2OU`F8Q_oB 6·Dg=$gbwb)('}^}jv5^^$q`R >˺º}֫#- =7#PAħ"?tb81y|Zy^g2Qs}EZ$$s<_(_S$*Ӥ@8`񥿟ZЗ.vaROgmBqH!ޠ c `A(! jc0*(0ߥZEBWN|D%(3 xϑO mT`BZh  Q < F3P Gy~vi%mHB"R!pȂ8D.$.E$Qy2P#n2G1C/^}*b 2ї0VcⲵI&tH˝TIJg.7!/5Yˉ[eDU-tbj&mnaݞK_y;SMP[)8`{Uw/h<%\ r7f\2ءo:L!Gq!xN"US\ߘ_Ɓ؃;$&C5E=Jx`) \?|P$8,&? eq6F!)5G?a:U].S7xȉ( o_" GhԪxg[Ԕa%a8Cѿz5KChc B ax38NlTj9(|7\NԷyvZ}mF=k8/.k=-Ǩkܟ6  ܷZFHiY; D}Jv2'lH)K?tӯ⮨$n;j{hMK=E5+ޅϾQQI mN+]aЎQSY$[CQ-lXuQEPPӌ] -93,Ҕ=^]a]~mf/ħnI7Mvp$:БE*gR!}8$Ѹ dJQF V ޲[veWs1⪷77A_.:lJ&2(%4 T\ݛ<@9XE`@j3l B/C F8A2rHDo/"'I5xOo)KtT. >cVմ[b_9!n#׭Dn刦-LtkKLUBjоFZYlbre u3o{goJf˺r8<^Qb5b+Vr7ѩcY'!9#h+ݦ\Mbb|.E\S)JyiZ= zԿE:$7ZQC4hQoa5ppp @PRu؆3ԑS!_N5mwJ*> {TO_b4L+Q7Vuz_ hGe!AOE*.z?v%#޸܂+q{m#&$AJT##e_ 6CȰ#'b2VD ^G`&Cxg.BB+5b6yCwj7FCVx-H@i4]@>4Xj&4XyC VQcAƏ4S=Ynvcr/Q7R> ۼ?Pb!.ȗ16}<1=Ed^%vGGSLgp^sH,HJC'xDTA; U 0`c{??pwq7DopC @(BW[ 54 FB`JY326ua v@xCy48mȂUpqK T:'nMTqךjo⋣/\!&.?5I9]|Hg,Tmwz1u^QPZ>Cj(SnU=GaA=޶+Tޯܔ;IbJ9 wI&"U1.\؄>TjBs_Q̵-~R*(𾴊W}&gIEa2Ij^о4ﻇhߨG&Wc+[i7ls ^FLtͯZ۷iib7sn뽣Զ7{Ȣ׻'ݡXe!  TN<a4}hc1ڠ:R3;w"yшFC6löXU5Tx;e| 7\tQh(B~~5^"QQ'SHWHML(1E" >a7.879eKZC} MYA)DE1^RjnG87D F;y>HvNrc5cOEg5~O1}- P'j/s'ڈ1X\DZϺ-r\}hn1\,c}%FOo/QlJoUNCP&-Uph\AԆ wxJmf,0O B,rgQIiF8qw񈁻a61Gp:ESW(288=(&r+(l(K Ԍ9dA=8 Q w^,eR͛ SԘ@2nvlB_^BP NsG-4:rwE{.F|#qBi *Rqx >(Pa O-y xO1k9#RgqiKXC)4C[qBUA<+x+e:ȴG/9OxP:iٚRrXlD@U4VLD<'f o f&q :"x` L-*A SABƲ:qE.#'ev\XTwN6or^0jt,O#;S[B~>|$BH~wȇ {?] I*,~(JPDQ1-]%9>3_OjjV>d/cH2;}U}5t`B˜4-D{1wrϫgQ0"eP;mӷ8&2j Jwnb0jRNGC(].H~3ʊ$a3y~]|!3 _IG4D<2Rph8zhVƏz18 A{D̒xZmu!2m#T5;-)r| 4&E+z;dgs:_j%R.Il.THS&QPQ( QKY&>|1pY(ĩT:!;N@LCR!ZVɕ;pM(Q6F p+9m6䥉J:4hDrwK|le^n> $ ]loB|XF0'PagPZG  3 <ȅpBxJȘD@EFJΌ(E<%\)]N4CNTgNPiX2q1`BCAp@]%åSz_$:x VzÌn֏Y\;k! EmL2*+9小ɦQ>6~(jQPLDi ;1̯{_N1i8fXĝG.ϑ<V<zQs \\BjD0lE4dJQ1$!s9"c$\F3 AN*P! UJ͸E0BkD # .Ȏ6(!b Ijy*b+7▸)6[%\)Fji ̖#-N[bg:|ͧP塹BQv|em j.J{i*Ks(7^Œs }ɫ{)؄/\|&F+ lM Oi aEJ(7¿WxoIBn}\э~ Gw<}lXح!1%1V.WW6 fKTL4jW=J,.t{ D+i/mŗ4 z, nؠ cEMzD8c8xhxHA)T@woDhHD"/|R?G_x_z?5TyB;˷ R>4J-q Jϋj)R[,t4M# Ϝ-){/K_Xɚuyy<,{Pؓ:J5,yhȌz?zMxZF@c~]Z]؃M\F]ASdJH?@ t5bv8+À : ^4=&O  Feb6D= ' 2A>*ㅈG,ⱔ#7gQpb 6XpzzJAF x>i\K)UI~ ! 6q=.h5c/].E) /WD0dt5@_xeP]ڏ8*O{)eFii=i{x Y MқƇnM{Ҳ₣IzߴQυsm9Vhk/GtD)멝6FyK,QBd %7<̠Ft%iZ7SjK}niZl-ulR%Qz ²MjbW-1?gٙr[z jg;x|uY)24]ݪ~>V+}k-WqfGI (MAsFy mOd7dtF7kI͔rCnȻrͮ/' G n赐(A!;ŗ,B^$3c8k%EOxU[A&d\ ,/@C[-x^IBuM|p-#w Q є߉30xÓq;Rei-3FdB#D`m5\.0I(nH 1az")CUQ\ Y΢nro/Y—+G3u6M 7ܓ ҐOգ_ TP5\y\ ?`/ڣ%r"38D! yp 9*)p9)YbBڥ mR<:[H߫]Q˝e= cwˀ"02&i6{w@y#1ܸm4OI4}, ^"wn}о4ޢ>E{Q< r(MQ%z&3sё&Q"? ^2OX|#*y|#ᤘ5T  ;] 3 ."|p dH ء@q$(qAJV1Qvy* F2^Z,7@As9tEnj"7iBe>yDDS uݹ S'{c/FwBws-.IO,uqf]a$5zڳYKx5b1|!H"|~%G>t6a'nz_:6G~Y3w-Y)<9*+M?J i$3r!U Y.4%nQ{kGuya8pbnHY,p[-~>-.ְL^@/<:r!f*seg-dj^o{x=OUY9&;rG~Zz,fG5tGE)?AwMZCEkQS;5II醅,ԢPznXR^ m!>wAԕ#uw[%_YU@&6IMb4;59_O^_2/8\[6, N6-27>$;'~z/Lp|.yiJ r4[/yxLmQ[+5O."KLzn4^CA9J{yt 7txP GM5PrѴ*br"¿nh.h$!xaC ȆL_`6eSu1r#;   ;a 8uGw ǃ{ Mc#C0|IW3S$nRyux+-N ^.NAeFFQh%d'8 -lG(HW]m(ƧflUK7Y^c~r1j_dBZ(4 Ռr[2+]W/KO!#ɻX jnhL켓ڳ{aw]@\p=* sd48.\6?}HEDsEԞi݇_3eeznyzYZϕr/df5oMkDZ?u_c#4Es)/"Wꍗ /U\ywo/)=y74)vqKk }QW<d[[l9Iv"gVlU2X8H^@zvyD3b W|"3.*=d㍷hܹJ(sy}nȸ>].[)ݑkyjJGW7lcz퀱=TKOGVڋi9 @Bw1Ȇ(0f$ڂ.E!,(F~ތT~:b7< ;~F6 YjT]=A2!8-FPp3uq(6&4t0x 7=CKX}\A{ڻ9س෩/R8:tL㩾)mhaWb|&{j- s3RmjgP!nksϨCBM Pݠ@oß c=%n\xU_Ԗr/SFPѤ2[Aޠ-KK8RJ,p'X=Ť3PIy tp~n (kCL:C ·rϑaTb|ZQ!ϚdxBcށg8N;= .$"vI;2BکW˫X̓0T%HdGs,L;jqVC5c_,O!,YQG(F$J-9e5x`lD.]% =6 :6&MR2q k2dJ[zCrֳ7Ыi(gE Qn(i)I,V>k1e\HCP _.9#;F(a6 g pV $JÄD+*>VC@HEUGχFzLb*As"E WM=}}wvzܿໍvFA! N+E}A 5Whv%u&z<>H*h$jƘLq)I7>1:=q fc#(,(dFIsw,tJD:-S wdlF N :M Ub[' 6?m﷋D_[ Yljj[3gk͢Dm93z#>NqR hD 1R[#"!! ?qP7ꀳ]8(ÎeH]ihC`5Z΢d÷IG)G9bVhc!*ަ^1 xW;JoaA^8mFP-/%1@?Bk% a8Kx`#C+´}fH|ϑKdM5p q`^C}Ɂ[P z! C '%~P3R$H$ +fMgnDnF,)\Xyb?Zrky |E%BiyZ?\Fx.,QjZJ[ljx[De"kN )f=w^7:zf '(m5P R gzi:_/,j"QQ؊WРB S@wgdk6@~uxUd z"t~c?@k *CG<q y>` SyHx3$E# B"'xoc;^DqJݴ&t4jrA4 ;l0##3G #pE Ԗa` @>jzl k[+ m ,0{n\$Bȃpp0+q Zw.m[UTEՀջwHq.>L,4Ѐ8u\Qn: ;LqOCp1dC(e@FvLe WJLPWČt5@4fs OQyi]x.k*TрSp7.G5(&x>@[kOH3W&wsCkc >5g2z=.B=NY C*b"J- 6xAU% >hP5CF{iF}7!>9 $w( ?_5#G8^hdB*ހTL0A@ w49;`7 "it,H#\;h=CEV䑃ub"U*"|5 [t-X 8g识7mwmgVR y 3Ґt?%"#$har:'D88pXAc1/9_r\V|xWP{†Q޹H/ Gq 'Op!HC<#7pq-`aQʏ?`78PpIS.>#x: +'|;#62nSMǴfZvgJ{z5CCQ83A+-vrc6DYQ>xԢL ,pΧAQ ;1bV};Y[hI"LeVٺH\{[QB5xKхn4. +,0ƨS0o :q+?<U¿,9 M v@$L7y$cXP;ayˆȅS~D.mDdܜ{a0aAY$7"$4*縂8p0%؁B?2^^ɛroʼ)1>v-w-q-1'b\A WzzDAꁹ6'nόx T*RE )r thhȃWp_J8"8B*ᴱ i1v 5y7U!QRd\Gy4G($0r-r;>TM@4\*}nhD6h9bC*A`''Ǫ-}_Q" OǸ'zKFViT8rE[/O.Ϥ\YbIّ2tz;8q h48IkS^ʍ*x7HBT7HhqCa2yRscn M6ҞGs]ޢ]Zo+45M_85~r';*=ޕ(ޔlt\h)2 ( xsR[/ wXFGfʃ( XhUDbg@QȄAS lFuDeXyqEE1Z2gX Tp@:~V@]>VrV8 Ȋ׸(<4O:.e6"y){J\Iʙ9 EPqnt16 c"WHa`w0UB___+^IWD=QwG'Cs|hi_? ?pG$!@HAN; 8a97qkwY86ڷ=?!5W/Z> m ^jL+/x*K!1p}* DC)( &XpEfHСwaB0C 9_p%;:.yj 8v?49X/ytq!B`DyaJͤ鮭Ak=f xx= DA-ÌBߑ>G|XXPݕci0ۖ )'==]*%;شj[Ư$z7L2V'DFUVZDiI2D3Ѡk%}Rcu(EB:6c-u G84 P 1 I€ ja%b sJg~j,%3OI'LtRK]-,y\J[,!,wkZm#͛˷0mOﷸH!t>aN invusſ{#Q7V6+\bDvؠ9P K;EPe@GqgCI]p~3q:!7RqVdNc,6Jc-y=&N_Up>9ԕZs=uKl33GY%)7D;JxQV7b􅹩e Rsek6j#$02PAHvcqs]ivl~71 Y%CX|G5QMR!m,Gc\PoV#>!m:-_WJr/}\:q))Ni"Z4DЏ3ިI.} c8&z{0ϘjwL lkpwuMZj#1|VL \(:^ѿϳӻ u-VnPa>PK눭7"q#яQL/I|O,ަIWU`+LJzVZĹ- )&c>ۻݟC)E4B#j \eU`qp3p /"rb+_y|{rk!g3ɓOk!} I 4;0ս/x'v8"_2$^jjxB[FWS?֣ [b jn̢eɢ$m1p.(ћ0q/`QQ4?jl 0aZT|.oI|aEÞɷA/J'?5\W:4S>KYm:ؠTyJc&aTpR= O*VED6R  (h*=Caz o$|PAoqU:?8x5AۛV' OKMldh$} WxΣx$ϖ( iusњRwxOD(TxCvC!?Ź VSy_lJS36-T)G|{.kEfR/x>[{$kEfS):tg{EVJD>?Y$,2\i/3KDžNV@[SpNE)͌@\wC-DF($f$q_*=םqSkZ*!-y ׍(%ƗFUC45EA[c]1ze#m+ IxWءQ<ȃ<؇}x2 =2 a~G_FU"vbgI%j5mXe*R4bb!@ms c ar!ϑ7:82: 6HRyWiAU)NR6ZņB*b ?)b?U\qtKQe)6#H,;C[y]c W^Q3v~}\XJ]QQȂNiƥ7ɰ䤺g_%Mk xɠAG!Ta7dC M=I6a9>tDܦ(TVhFI"0ќm2˷ɗڧo}=xm\7_Ӡb"0r0Gn&?0 .7h#vXY"wYWM~}48),lqLQֶns'[+[ަqw9}t i+48bԇ:K(3kq3ȉe58/ֳsm.k.B{%{'&I#8Z/뻩W9wGj ~<# xD ~x;"ey5OUEu>ej럦G?lʪY.==伺$oO:)8n "e/a?RH&3N0Ќ>$"]a"D$AVVMbA;DBoW9zMu&%%6*"Z֖ˉbG|Uyu TTeP^Png0<-I Z5PAADoyCuȁ Ƹ@Ej$^p~Ģ3n iPB8 ^|7{mFN7 =C!-WDc /NX ~ iCiso1ڠ<"+pГK˭NTvKqiE|(ZIԴ"( Oy9oEz'*zaw=i/p['w>: +袮DC{CF('dn Y!=p\iEJhL!%; b0A#^ UgDL?Ӹ*TZREc IPV8.~{&|!|Chnn܃vSizgˇI8l5i8Tr'Ic̆o@a$8dP(98Eڐ̵ŗ埲R̩Bm׺7/;B,Fcid,%㙎R>j҅ *#QɮGYE $MѨL{.c/fDDE:/x#'nאXK|?.bLXe ! eQ7WUGUBDKWOᇜ5tHTI؉7Iا5楘OKiuTQ.̷&T!7RDGx'*KxpR+ʈ܏״fY i'wtF`f2p0JMڊ//EpSATMדl:!@3CC}GbғsJ,Zj%ϣHR -#~)0'4*->R;FblE#'D=KPZPE8)'x _ott'Kˬi]rR\y84{sf H|pWhA IB$Z*Ptqh@('9Y& Vh)|Mԏ8S|~ؑ|.y(9k6n3M]IGuOJԢH*٥RX_r%Kx}$5$2v|6 vv|_Jh}9Uvy) , lCa#y76Iq-G*^! ݠ;qx# : %S-Y@Bd)fKR/C(yI'Z#F @MBML}j2d!6w.<Ӭt M&0>Ђ`n#Ē( t&(r(j?eOǷtN}=Yw7Lrox*hz;!M4qv?){dA`8U o㼞/c+>€[ΡD[ޙUc%U  |n˼a㘊"%~2/y"iLIqw]նF!\sZl7e^~+?`J"ӭd銗SG9׈#"C| |l3* 0¤ -I%x$ -ZP^y- GIxFF8eMp5ۇGd^(Wyl2iXo$^]iz%tqB'߻RpɥJ S lT_6VK.NDM"HUj"whz.=MV.0Gߜ'+ X+=oJ.c$o@J`<'|@ 2`6.:xGx0Ä Mp'0&^+z:wRi~x0lc,Z./2;Ґ LDMx!V$ E^ppuR Iy PA>n~|(M\hYR%u3wf +:{bGs/Soy(A[*}.ɚ5bUST- G2[)[^bkM >B(jjI NI]4 :@jC|t<7P"`Hl#U A,G9( "("FdRΐ&=p]up Z[ToC&Sl+mf{W]CRs5;6gn! aj`~[5n4jj|#Ut ԩaᨮ%N|] iBy:t$IIJH F`dBa`#&_1QT -;W!7=\Ȅ s|0"ry(GB95{0IP cA *#w蠇Wp(A 8NM+ 1i+G%ev>rZv9B &@EDaR8Lқ̠='x kpN\HKlQc,"WTa~>Nb|Nѡ)usy&Ժ>p)9;t$ӝb!ݘʻ ԼBl͟|5h67I텤yґl!tryw<#1݅{*OBEzW@AJgUI":;ZJj.Hpjz"yI>[FˋlvUjBݩ& n &—4c>,ZX#\%I,7Lv#8#5 (E[/0D0,c$PKFZJ;,h=mXDS'y$9963NZC.g=ebi[s~AGhf$w&<䖤r g8;cn,CZF8j1zd}Bq(G A5l4I5.^?ΣM>BꂐU?Qeaԁ/Cn/ vX+rtB F(li3 ;/x2PA9 ZEpWvA Fsjp<E!Ehz\$H,L>lpJȦu2fyaZkLz[:+ՒWu݊XWx9[*!G֖/u^٥='@ё́kSi/ @/$fΘdX'AO5︬)۪:UI#nDܛE[@ @Ϣe ߡ=֓bHw ЄG؟B' Ok{,\H :TGؿ(I4z~̜"lr8z#@sz51A^pjȋgG}Uu#r:NV 3x*\Ch;?0p{܆6( /TE(D.12m卪u|7eK4N) 9/CVu"yIq\41,@4gx";!eWQs;(jEA-Dbv2UPա#< CBH&!ą\c7;x-bJ8)M]+}$hO:( LwJ^ JKM)i3 {t.*MV)C£A+]%:4$]IGC\,iY@Ő_4n!m/폤slcnKY\IGHwWb[>R jރ|jEjCl%^:FZVϊP!߅L$#A9zyOlΉNqmu=K^|";@7 +fM7rvd.6x5/X(P 3YQ0! F$o`O<&aug3( <N!Gʑ∂;~8(uav()xc^P)BSҀ!EIK+,'}g刪eܪ9q^vVd|r..8pݣ&SeDLU]-vq qfX1L' P]|%~sᒠ"Yv-Zm pY)=bǕX42,]9@tsկ/zPvb 0 K֟bʏӖ WR:W<Vy)HjSmLԔb(Gs|I4btɲ0}oBz.9}};MaK,4}.m3͐lcsޞL#yJJVVGrWϟxH:PpZ*p $sa{pqݨr/+$$E7"@ 4pVĢXɥ(R=t| ---b*!{y&oB^ko?7?*!Pv[PƵ[  wtmt٣Z[E?|C} %XJW׸ Jp7W" 5=Y9-ְL"M|Aޙbꑲz !x͞"4@AL#PV"pgB5Hk2eE xůÆOx4'R& 1:Qm-UM.W{MaS6CʡT"H[GQ! Dc*`26N| h;'%D¥o<aE#gƬ)v[yQ dIKHd{`hL?%QQ,;&yG.⮣V|' _CNOtVMFhlznڠs~ݦxƐ68ڒfM}?;k|Cm(" dHDOW YȂI%uG`^wx%#B~<$菎N4)*UuTF[HT޹! i~iO:]~:|F27et$( ^%6~ nhk9>=n$掵Zh?[,&+1QX.wv. tz#-W=ۿנ7gezrpJ~,'{I!&_װӋ]=P~ `^grYGاz-cǡJw /!UtOFSjH"sr j^?mDC>#^~)oexsJr+ 4Po.RWm071NA 5FU"0?_Lu*fnBS=<8:CC|@ Y1 ЊH'y.xap h wTTG9N B W N'EK[[GۛSza;|PZΕ}v^( KbX Ҟ QKwz+ӃH̘Uú裷iX?䛓w&fc*Vji֫hwp g6W͑E5|]=hYMN3Oݸ5ʸ{:q s-"6.^p#9$ml]-_]ۢYa0a쐉Y.Y62 0``1J0B)cyj6qk}_|.|?߼JzI?\׳2+ч|s8 ݪ;`HLF>=lX.'e+W@&9 ԡ>T|V{ϭkҹzEߏO9_3}E I,OJ! "g<WK}(̐uH{r᫋49^4d+$ А,![IAʓ~kZPxk YU_k;ͽ۹!\f!HFuT@;X`P ,d ΰ)T_u[mDb o}ݥ+\}gA_ ٭0{K.R[[X3l}LycYiܢwr̢^Bϲml3;ZG? _%޳,m eHMb`n2n91pm\!0굠).vݟv 2M/13u=aX>t@+ F g(8Q~`+9{:QaqLuA qۅB_wi~i+7)؆]S;䜱 ˬ9ج'clj]^~omn_.ҶhhLRHA 1g0,I[+$ q,8OՊ N)XʗqQW@5jl{m(/mM- 6BQjzX[ iб%*,h~ٻ؏ փk U~H CD2$7XJZ\lgPjcҵ?ӳm} 6Öus6lleնW0wޒ3wC'³菲HD2߿Ŀ!b ֳmn)i1I0IHB2#?| HUW b|:gtmٺ}aN˨6hZ~ 2[|v~ᙙ4sޒc^sWo˭p%R$WeճU欄LxȳVn &vWxNv}-'TEw儙07(\GKM)5_T+Zo:?R9a>}yvCu3lgXI>өdH;q}iCڋӏ "$,%㐂4•BM^1n4L-X[UT'Ug*IJOJR~>G5 +?f9Q ͎@1 Ne,OϰRoy_/ t`2˻[Dijj;CBBk1kq ,Z)d-_{{e_z^Eщr;jIG-_5ﲟ'GI/}baC8 DZn.ڤ*P*fܐư绬ݲwzuڧ&xh lbpxc=yK5B槃Zvm|SocWΕ7#v7sqg\|#od}UtIuM=]Q}Uf7[޽̌&qSByXR,,OZ#?ȧY#}pnPzŌn=L@ %4\D7H"7*k/۸jjY;cjqsN]Cþ *7H[Yo'U)HюΥ] j*karK{}} G5%z/$ Nt)L"0BwxJؕ}[Z`mY[+^d8@c(IJ GB8h-Q_.w|7|-؈r-9 i`utKsQuV9qנ3(չ_z5rj9Ĵ=GSUW]"g $?KN}5pя|ݽc5^_D1*$5;Kv^'FXb v:$uF6̴#C]yބ/ /X$#XsPsM՞C'bU '/}E!"] LgdSLI7iN'9U_XxuV]^)CotX r|g7T_kI+Z _ ͯ٤NJ%93&]j87A\ֻ蝴oǖ~ dڑMg,9\F8-ې{Fmڔ$)$CiDG^Do/B }"ݧ譓E\**bBEϟXs, m,N6sJOiMcEF-W=@ 5uu-omGKW#s{Y7jҦ޽܈llgCUWUɪt"N2,f֌Uw UQ+ HCB*DA>TE#4E ,*Lr U-<#uA2Hz2=GVh«[-WE͎>45zlJ(?]|9%č#.?z8.MZ-}c=;=5d}]Z=^QTW-P5=.IoW/oT}UтL_?Q?Ua- MM1HTe\R?qKʎi }[^5_}Yec=[YewM6QȤ-׵.U@SKP|AKh?R<}1_.9Nc7d(WrԵ[K}^qޞ`AhqHVJqwA8A׫/^x_(2uS*KGh-8QI$:=`{}ϳ݆lّ=6%m%Y/%mBQѯ_STx  T6 O">")yH@`,&[H'ap^h"{L)qw[uQ}UScgr8VY _iNt/+תSS͓͵r"8XE@|HKtF_ih..FNW',K>ƶFZPL'v$аsu;-oVH͎[,:3}EM =H:~U /n!m;|DMG*`wXI &1%\phmX4둸%2?f67FRIxKZXZg39}SQTt*]G_Br?N~s;D)*iz5H#Cb@sVXepQoɬ%v!^7 t%- //2B`tMwЯo$M| ?Tf<7 I7|'W6DSP%Hk+p!hM/76<lUݑQ^K`G٣x> zU?tiX'mrhI*=РΒ0F:+L~EX%I~RvL,  A_m*07N(.>vM_e$Q 0]D?@LWB9汼fPv6؉6%C+U8Nǰ]M=R\Y&o d'f$/XPz;g2#m@{Y0 &`> qT!" I%FQ@ۮlpƽGJ_*QyOVsnv?o*2}3Bqi$QȂ_6lޤ_ /VDc>8 ~abFNJӂ)*_'e-rhq84QzLx3"rz!HiRS-es"#)?-v`ݯe}Ҙ| GB{I;$E4Wr0}|Iws KO5 6HE2q^F#Q˱s*.}^VLZw.Z[Y{NeGA7NvD\_nAt(B=wE6 Y0: #''ܙ\$N `trD dYĠn~ź׳VR(Fw 6ֹ5Pw၍R}w.WI՞;ViuR+ | D9㌳_s?2l;d;d;޳=Oɻyj،_D*iJ v;sl>s}k?ίZ-~K=lf,,ųC?t\9ST>q|ĥι{>ͱͱc' Ƿ1~7LM|_W(Oi>>[[xWޕwOS}Rĥe8Jn+MXVUp5y[.Om<Ҹߗ eukVjzGʪں\ӀW_}q3Q-N,ٰyQ tkwgȎ}DŽfe)o+ʵ I.soSQ sm[m[m[+ 86sg%ǭʭByE>t{E={rƟ-^QsΥ!iTV*+;wBQs:ή8>'<3#?r۸~"0r#79;''k*?mmm(L3r9+ȥ iE.W$An+i 5p\ӋwC cxk-ZrMMMcرߨ? iS)bX7eg:6|ēxL>eo)C&Y5VUvn"<OU0$fפvJX5>|)b&$3ϾK Rݩm]4rԦ}lf7%LHzV6m˂YM ;z+Fc-`r[%VТ؁HGFn9blIE{fM*IF*W*ZjjÚÚ:q.q`j&j)# iAF @~ %dOP?c1|ȇ|HJJJJJRr 'q+++ͱ/q,dI9r$&&>r}fr3yGyGyGNK:MUkZ{=ٞP&L@]m]m]mZEOtx5P)((?Or')Lj2[[[,/˪%GLwxwiiidEf9dW- np,9K-זk>H$6mۘjjjxXxxxA"yB^:uxޛ7Zb/.]=?ߊߊ4KJa@K3&gL6U0U0UZC뒯 A{i-,,,]eW5pSM@P"*o!HULl&fJ ҄I}N8ַַַϚ53kڸMx\%}}>,[~n苾11'YVŐJ ,9Ld"+#/&2.?KnRZeN#[nX)]~?>Hk ,>)D}'7_9|K o;j̏m!R%[A8ڱ}l.؁?) $dlIYҬ.VJו+kuEEEl'l'l'SSSQP`S"%G. h&2*cNݜ9umSlSlSlkmkmkJ,L&kj.οP pq4!MHKKKQh3}}}555|q7ot ]uuucg?SsK撹1o[[[ʋŏGPYlmm'|5c1 5 5 uϩH%I β~<;EjL(W>Iz]jY*]JeQgEDf"SUK&9J&Wz>jujjj& oFhF9_'|'D#|D0 F}*ݐnH74u5u5uR {sp>W?U?U?;˱ LY+@I0 vwFn(1#BSY7K7EZϧRQT9̉; YXN/ȧ-HD"RtMt(R>>> d29};3:KK%u:^/``Ev"!f`f ۄmjt;.U*HO9;۟Mϑ[V{hkk3IL ӄi + p W3^XyVW0RC0CrR9jjj*EJQL= [ƖeUgYuz^R[(d*=Ҧg`TE"UѬԬԬ$-r 'Fc4FhͣR.UodyN^2 YCw!HGt@ Xe^W֞֞֞fevQuEHs8o[ Ă~((>|Fݨ (C/|+J:Mv_d#٨*bbVUiUJ|d;N;c>F1*WYQܑ*x)^#>%'B22=eYG֑skB-$3'DH+ ʢ,*cݹ;}ϾU 15;5;5; CO-"y"9.?`#9'd7Tl-EQEX*JKKKۻۻۻ{{{)1ŘbL$1e|:hH@HKҒdFÓÓ=zl Ui+kq}FLjOYSWfaQ8l %RKs~gzJ)EqGq>iTTG?)¿FaTA/6fI;ҎSJ$b0yC N9唟ixc; ނ>>GܿS)DGJZ=ÞamxaVRkZM&Q PῖL7y32jT+J*oA -Az(Mމw+0es!w9DRcx q(knF|xaUmfVQZ1窞{=jEH/4O؊؊vhv cKADK3f<׷׷ק* qC R&7^%^*3$D_```/CbCl]]Qw;uvE((B|"X[ϣG=zzz;=Vyqr B-bmY[Vvd'ސ7 h#0#TUUկԯԯ.rl/!yßǯq~?jq~`#:ͲY6Yl;HEBY+Խսս]gtXosq)¿JhpP%P_!yC97x7M$/11n_"zTXtCommentxs.JM,IMQ(,Pp 7}IENDB`rickshaw-1.4.6/examples/screenshots/lines.png000066400000000000000000002036631225123340100213360ustar00rootroot00000000000000PNG  IHDR,Ҹ gAMA asRGB cHRMz&u0`:pQ< pHYsod vpAg,MIDATx}uxG={\s4; -R(Z8xqw-n!$DI۞8^>m+_\ffggoN(R~Ϡ T?[Qwe\Fڢ-B"F6`~0?L<'$z`jr`g嬜U (A J OxsǑT"yȃ 2/Bw#P@0`` &UVXau:ӽjW}4GQ|Y,DS4ESh}G׽8p bl?`f}]EA.` RH!u] %>%]1]=?]+b2kDADតk⓳Mgt͠49f\'? ><<W   ">?9~1a 2! oy>+}(2(HA ;{ߊoE:#L&IT `~ [4U*w=xwk1Q[O?O ===wM! Q_ɧ$yafLSy sKHA Rݷ;;|mw:[?I4G888Lt&:ݭ4fS& mb5)4fS8:4:NE;ڎ$D+rU<˳.dL*:Y,>>>w'ş,e)*v ݭ4&#󔧔/ :WEZ&v+-^Ҝ9at?0>GO oMt߬yH҇+W8?Ώsfl? dAB!Lj"yhK(D;p2 '_ʮ/@"7o8JSio<t<_pgN{=Ϟ'))3RT+Ղ***Ye+e/Kɥp)\Jq@!}> J*(їK\'Iͩ95''' q8C|!h,Vr$Z-fB&{|NR' c^!C|OKJJr1\ cnnM&q&eMʚ4 i@Ҁlu:[9sjtҢ(A a;N}>ÎÎ{DHi;7ou|]mmmHHH555L*, KK#EKҴ[%.GǏM&d"ڿc&QG/KɨNtLwk.ۅ s+CDԃz`,g_kb08}Ʌg΄컶by\[h6\L;>^r>2mϵ@ZZA 4}/^,=ғ SNSNSNv&L/畧R:'f]n õpwww@S) uBP=]=]=]RT*i4I$--m{׃aCe !4 uZ[[kjjS)C|#̊2+ʬ0.`[W/V/V/TTTsI7m/A3f/_@\\\1F1F1m31m 򏞄__'e+ݗ\>5Wwlqu4FXȾ}'/-- rvWL*cQ |4jFAka Z_":Kuw>{׾(l|fBah܌-;˯jnSS",Qo tS9I_>WѱѱѱyyycQN{ hX{i2M|#C1 0\:ΥS_/8йt.akFGұܱܱs'KM)uix=ht~muf{@.~nnE'8i#ڈqU,iMݟ?)G W9wV,K{y9ҪhkQ;SOu4&wy]D7cc3NI85fѬG1iҗāLDZ\cٖirj+a|"Mk:0MPȜ-Kio~ETI~~?Vh5x[-Zڞ_qxFn ɿ_}>~)_ʧi|R!R P DA I_ބ^l&${^43s*MM.*sAg8TFex9;Ked{a _/ lW+w%3 Vw W[c*VD -Zsc=Jx%F Vb_^D2t!/[W=j-E( C%Ѳ3xs\X=:mz̢ i$bfˢ,%^w@e}"~~xTGust]AW#ByyyL-ʽ$ArIxlXfxT;w%ODu¶m˘ʘ&LDB+ 8gx%1%1-SLM\<9lrXv iG:E ~?G]f20%Xn+V#Y8E>>MX07Nx|dZ)ڂu:iAo9d6!#0}*i8 =\ˌ9*Ob@)5ß2,3L$A ?@ d{0e7jOZ(p=~OOHT]]ssKKKa0Sv I&.R,E``lYOq o oE3fEb3ROyDŢbFkQXNփzP1/ڽyYF1^XY6z:WD/vl+?d@OD금=lkK%bhG?2ZFikv+K)KƌG,˄p'B_J(Ҵ2c_uzϝ=@mtuldmr ZO>6C?+ewfB;|tH֊\w}UU446n6nfܣ#rۅ8'jݧg0RQ}.eSk]k]cnjDUxN<B#XPTdB1g >7@t\Լy;9Tff5UuEmҍ|FKa$n "1Aͪ"¥bx$,@5\FVXʿS{){6NI`qi&Ex+A]Cq?X?A].pׄ#?"!? -pN;l ^VIḁjxՐ &dd(7 >G#>p*~mm!&$}`h`|ǡ{; w뚎 6pz0cc!7ONN;wlU0Sh^&]+]+)_%})})(e_b_3_4_t {~-}] JM&H< 7pbߤW~D~XzJ8>~!B0{rU#˞-{VsNUD,bQ*f!ޠm98崽m>XC,'p}]=!O|!܀"P \ 1|peX: _X`;ګ)G%olAxD0u| VvqFO3!uFQ@&f8GLW!|kY"B+%B!0CRPph &[%$PU%¦}Q= l wf'*ߕV$n`~.۴-ok8Pt(xZ/=pɜ\#Ajv\% $ q5| (=$|q.''XhhXfZf:I/I/ rˢEşy/}h;)Nc|2E6 4+D;9{sZR{=Y+VoVIIN*3|5~;x{}Nw9%]Sr@p~`ܲp(B, %:ݍ:"LOٱ/:>evCIdG7 WrR=< >]-tQPɆ+ت1K".hX_v/hxXEtd__ }/A"p#18Qtvs :Too1@+-ёJ r5]2]błb\`β\}rRCYfydԓMoK%k*;ap;w^>7}nJh ba0ssxK%F>}\Ezף_^Q Q RVG Ԁ7}M_c?v0n6`$SY"-0N$rB| M+LE%yُS6\"3FR=^k|}YE^`qdoސuQ))8i%Ús>e5+4S_UL|yg"0N:pN Fpt9Z4Q4w1dc?iݵ7F+"Ce/叩r\|xz ki |B<`vA E+ߴYy Т><io+ZğH@G#) ,Ldb =ߒnB͙0ap pA<%]H>>::$d0$zb*S\EE0~*"b栺CcB %"/Ww>_Y4"5D;ʠ Ę8L.'oX x7ћ&r?MޓUXx>ODG\+`dFfx~#fqol.Xɯ1a$*Hj"KENU[گd캸6|3W9IeKt J>o7WΙ[gTկD\}r3$K寲?вFČKz*A51(+.E~1 БO@;QsyCP6UFip_@fvڹ(|ܪSP0%c__N ȁ Y׬aqi2{hDCreɮ3W!і$Fp ^- H[-_ KЅt!p?,N:Xu1L & < 1y{Jȉ=L&( /)2SȢfjf#dIҒD9I.]IWwh2k$Ѕnp2 2nCAgйռIf*4L?V® .LtTc*2K k'+8`{xb .oxܻ9:7.__d RJfdvAǬ>lۄwi虨'?*Gm0B9aJ oq1(D0}AeA YKZԨVd+r$?$Fc4n+}+Hd5T\I }haaR5^5^BUT§,c !DA&E. _D~jѳjd-Ű-"gV* B,G]ߊRrJN%Cg//&E%qZ oxCJ6h?q8T0n]{lc }4biZ\˽/Κ`jʖqGFb$9.`D&X4гyjzUOʱt|@K'姷Hy4 Ҽ$)T}P?) $[[߼ߚ^ԕ߯|XQ%Z_p{Qh{s]j:.eIԋ~k><9Z٢۝Oʣ4BZ9T){^ly#AYLSvcNa7֧K2b#|8Џ) &|V"`ӝg~i;2=:FxR]k\܆ @:Δ\ϖ5rm3LEgA?I,&/i%m dO;GWE֫U/_Zؘj H-""<ͨy=766йKJԊ䪡)19MXEv8<]izjzʞP*c?B!GfZ@/ G]DםE[]_3@3@\NQZA#pL&FiKKA*sO?_hv>Ls;3F/K)JӊVoqs}T; k߿aN/c)+d7uΚ9IUWyY_ȃ/S x,1LK&1ەFm5Ԫ'2G8Q|b#0[1oKR_FgA-N}m.>nQkv7ʔmBBdOE} kK2D``=΄o\>ba\Qphcd?ٗlH} k5͑ï}'u T/"͐M^ԤW.xdegS')BG[lN;=Χ!$A$Ёx}uj'3 K?/o-/|4PqI&ʥƗJA7yѥkWdo۽ѐ% W蠃˱%JA fxxmm*zz,)#)#й52 j.W޶OO ) K3s; &}5 Pt$%uPP!kPRH!=LzY;X;V=Ћ nYE)YBR0~Argʝ-xWZd)v 2.tðЬ ˮK'|}}c c|-94V5NFݏ<yKc)9D`*%liJgPV_Ķ*y)[*^Q>僙%_lAo[6My>mKoR5;)Oʃʖx,T (0Y__ojVUnm:d$:yˌY@/=> #@{.chS. sί{H!8͐δYf*& c(e$$x` =Dkѕ}ro?]yZ~y/ heoO;8 Ϭ7Q5!xW+mXe^ʧ[^hD"N]b]PI~h-_n[^B3?`\.0?XʺxdͺhjZud3G_<# ( !^dG~pdל75*b$+wi7;@rHC?bu9EN8Mz.ZZvxxS +[\, M67u0cPN12@a4__Paf~{ZL4`mHIwUa󞘟l!q9iBD@msHEo:NBqK{͐ IR@8.sa4TJ9엕&fq6J;{@k; &)siNac,DE"uG[qMK}}U$1x"!R'#_TF=4Mp,(#R>7Lc:85fA`uRaٖ<}A[}d8lҎrDꓵQ%\RڣŶovU<-eUNʿo_Ť뎙؄w8hoO2ʦ+,81v8>FV1bm?8hJ67Pi,UR=Sk1&.wk.lڄ .͔da/ȍ;%*in] _([ f!=>t,WMٴtZr6:h[~O.A}}7G%jZpUJJp44h<7C߹~B-H WґJG<6]tq`*% %dO6~r1Q)E(oU"0lױ+P1iiͱSc~;6|툖HRB+\RoK3rpp3ZV^-|DĺU}ߠ/ZΤ; X@b2*ufḌg>Ltݶt҆K΍x6VC^%4bWo6$Ɨy~D`n.jqA?U8T%F9Ԙ-uhDo濿y8mt)M|l(@6('lyPsNd@xKDb%L9mxgqF3mä7Htۉg5uKyswN-vVv#.pLAv7*Br*jZVT^~[Qw(gpVW:'v/*gM,è+ΞߠBWDWx[!SEDumƛV[.ivhYƱJ\x+|SA̗B%T'17q6BHe;t6Y? \W3nhhH%QIDkkZZŹ]LLm0$=UlZ='H;+D&a/J hȂ [fvణTh`8󏂄p?3L0;< ]6Z.UT-=*"M*U^gVik-(/̭bfF/IH(Z)cd$I 5 IC@ z)ؿڌM)6?[v Zt5Ugk,9',ҧTOR4uP?Bn9R <$7sז`nXCk|Dza/뇮رm: T-HCo}Y5-_]C| CCdaa"QVWV9'Z++y,I$p >u|!,Qw׸Ad2ʓ)΍trGb Vp _2vaTJRTZZl6?Ju9GץE"9AXXc__y}dyys$)Kb6`A-l;u (Be^䠗p--pmpqmdh yzKJѓy7MȜmbn_adV\-b܆$һFzuq˾RPmDUcoψ>,'L'&ɷ-$;ḵ|فpB#uߗ粆 lG*Ku֒ qk:K,,u7O1d!§ȸ,hhEV.twVevy˙DۢXӀr,[S*\ܖ5fkGS񱹩4/לb9?[ꡢrHhnJ,˫{fҘҚ[箟5jȆi,Wm[rOf5 Nn≂{$LѡDe(Q4"Nf2bS e[ȷ6c)N$#D (*uuqv<JD*x_#S11C*S1 09 )br$i"nr\?ɜ`NjZ*mo,A.[T&ɅῄOŞ7qCr|3x#^<`]Ɇ|Aw5Hr] PWimyy[ \Wu J*.Ԍ5se<Icd7 /P?]:y>hQ<8d)!^XUhNy` Iy7w3Wj712N>pzHd*N^7-o7Kfj^4Vˋhp3,=~mBUQR,氠Pq'(n/sv8|zL)d6ϸY{UuTpВ#eP*|#P+"!$\} dR`JQAC({<HqyS᣻@]@FX;&܀I# Zkw_rFVmmQMMnE~ԣq76?zqGa&zp|sm R`.!9sM7x(B%NƋ%Eoa*1;llT^uʮ̈k4:6ژ65z[o)GuCѰ3$Cs,bĺ["z7Jx¯`|K@R,s2fA d 1P5:5 7N`XI KK~[yMnmm3;#5!;KlA:ֻTKe}@dY\0!6d# D]9YHR"1 lX^=}OM~l?>BSSmDv,%$$z/ܝ^6?r:өo!#YvpVCi_S0%aeů-S*]2d3whBh*ЯP0G>O·~|+l"Lm@ļ2sb<~&mEpS';nNzx6?ԸZ9eqw(Rh||:h-%)g/{hۺMбdz?HMHkl t!OGV>٬sZOԏz9U %؎5j["WpY.M[[~w"n[O9 >%q0 QXŨ$.뇳guFꨎf qlqb~hh CQ_Q_5FZ}˾L R/']qA?3nA:]R-"W2p}ʷp|@HL` y98nPC8%B"h#PSI"sN.nnW*S??:0sQݕ%Qq;~+z88MI+ '翏n] !w>Z>2Bc<!A_iT:>9ͩxpM LT\:~ dB :?Z'zS)a}|:Nd9pSP ~~^Ǫ-CT NռwN^޿-7ovRjPJo2M-rU׺J*Rnx+-6(ؚp/jj3kxg_YP^E5Eܦ#$>g>Їle9x~0`6G*7*Aw|6Dzc̷_zh&%.<8xV(o&]'kD<{;  lnlqX+Y -p>(|ؓ8"9#Fudx,\e kP#%84fÛ ?|tt^w+|kxE[\q\ 샲V[-;[x}o(VTT[UU|b׋]3?t=qR=tnhʄ2X"0!EZ>ƥdUm@a<1h!nG)0gnqi/hW߀fR I 3#@>>ep uc=K9_"KKN uBE8IZB{B)jҁGFX(  Xk%㧄P/G[E #`,+dKUnnk%飽ϔO剪1ѐ`Lġ/9 nhL~uLX7o}tW3kq@oOlkl$˲YoPW0N~닓i)A Q}M#y%q6{-Sy2qc#J8v~U_ d@Tү8v&}nZ,HsiovYCF~.b붳dNɨj05旰 fQ%sF TVG_|Ho#li/S59jd+WYn}vӴO7lN^*9d`mY_ݕ:ivOKu\-߾89+{F#[<={V*ZHyӭe`Fa@=ZG65@DW(+25#}3_hWa*C=CnQ+ 6,ߐ[bQeJFKr}o>'Eb|Qq %}rE%(p6KD jHge5H=8-bDwsZ-[+)_R^݀Wnl60}PSM70ҌK32]Z|iq閯Z 7>Kܬsaϧ= 48Ý'K],t^kw]6_PC>.`zr>Wٜ0qn^4RUxtY˘H(Pܯf@5ضFf9t>}K7!<3::6ߥ&B#42X>]|Hbb]X'Ğ?s; @(A83i- ;}_{tg"S>0" VTTH#j1TV+wbgU1uGtUZ2bDD2+m]W3.>LV >3_$j*iʡ6]m@ǒfޑWN?ϾE˯)fIih!EԠrG> 1?+e3V6v!8y时duȫ>w᣸fz}-y"Aс\qbQhi*Nߵ6+x8Ȗe8bԧi&U#BSt?-3L2&mU.ueR /4.¦RlR;Hrl(YV(C<7lդDm<'bls6[d&CY" R(l)5<ͧMO=_JCrK$u7>ıY3fno|g74I+YyI89._FW~{ׯ8s2 K̴n)NN8a0 A/]|?~cˈIXI跮 |dK?AulC+Gf_u20Oݐ\E_P-u޽e}a^(#H)Cg:t ׷voەdL1<(Q6ҧ)ɚ\sqLyWW< ]^5d ` {Z05Ễ::;^b/#+/^ E4HHf]MW ^$NN3Y{{_EH|$>.gPTP|noK}5>R5Z5f$ WQ y tK/ΐdJI*;>lWkeA ˴5ՒCơM LŸD7 V Anŷo'||L!d++lA.r?*K h)#^gQ ,΢O4 Ҝ4'\DZ:6ndT@w 9, dkK GirTzءc6,7`ׁ"3Hf 4ә)!)jGt,P̲Ƨ}|s'ud9h<3DMtn+%\Wjget!=6ג0F{ ۳^ž3d#1v[r3n^2MC+1!btlŽ/蝩9,r^<&#}VYdUD٪`%gKO!Cƽ:M}d_ Ntږ *џdktGόs h (3V4ӹ Yȁ  anrUDKrÁ1noE;pW#L 7,*`%Vbpgsti,RH2x'[ B|0NdTy"dHu4($QSf*_k<]tڭHV g;;nɹg22@n:j#.B#dCE^ݛ[c^?w;ΰ&:kR%%L :QE>[>&6PB`*Œ@YY,Cs儡e7B7ι oxϰeiǭOOJrkS"4WSҩt@pHTw-ю{>;l-q%u19=抔5d6H7c SBm,$:u&idC*_zgFTgs([ҸMjֱT;['~zj?6{g C*ō~~/P4qSM3P hJz5˰ԋ6AB*?/&.ob9i'( TQ>Z6|!F%_ù4$?^f.fc1XI19pYuY٫fbj |{֧1VCRKߡȼ/p_t6n;- %VЗ\OE.:؞ eg*.z5ML;m7SivbsWMŅUGfof"vfNap 9p2|XM M 6>|I`?s]eRKoJɝpq_Rt=Lt݁)n O+f_h_Y0G%bvvaN89.*iEZa˅ZZK%j$#C晓~mx.WvQvQ6!xTvb'S=aaWNSDOININ17R9_ND̢s ok`:zŸǯ6<: qzOщda#XIm[,WɜA\#ٮ.dܥ,X~rAY_ @ l;YVo xt#GpQ%ߵDEwt*~f]f8a—G{TCw$~ *H!p~Uv>NʓAˆ,p>y+l1~CU^%̑Չr@7"uag陂٨ A6P-@k YCP {N֪dx0ǩ~lP\˟!uW ҒtJxS(n54;2Q2d)[GoaCkwHU osxİܾ9;5[dc: iw.pRWJEiϺ}‚e1!^fybkN_6^]J/~uqז-. Nͦ=]Ncmġ;vzOaak^ tܑlg7z' I=)gFB츇Ȇc# ̭moR!>A&bGU|e؏;f;.fM }GcJ^퍲Р4-Kݤ˳45Jͯ^VCH,=|x$rLwmǚ-pP[]du cbzy9z1Hs Nyל*i_h@AMu-:&AiIUX-HʹKSK.d@df9Y!} r'E`ʥ%Pe5,cܤv1VsvIPәV8LϡPw6̘y E~lXA8ʊD5gs^$qldQ0gAHܐ9ϴGFƱDQoRj8 [l VA8N*F4./B 44!PCooEYfy>V,_C2r % 7LڒXϷյ9o E2NR,8Dg?gUht:ԼOݏտyi3G=D4:2~\{~w2N5˔v̾ X_ΕOr$c&slqhg夈B [qlU6֖160~[DX[1KpR|,L v>xT<8/(s;e9U F_i5a<%xL,ǒ-^?v3xIhdžw8=V0c^|-JMa>ʟ){u MO ײ~Q;D[$o+iŇ<"n`x<X9VX6Ug񊢒ך۶E?S s!=4653qh2 p1ȅjxg&sDLCP\6WHr\,sәt&FYdݦmLqYqYf08:vv;Dn8KԌ.YVU4.D/ ^8797S񅹛pp iL' 7YWZW:/#y4ErBrVEUxd?95'^c^h^t8Sx +*C;e ґY{E<Ϳ;[>`.a nWb|KG@\D#7HOe=<3.-p83י9lSe =2y8*!C(/dڢf^ŏ|ʚJqu b^b=c2$a#MO{ [>[!F rUz ˺ XٿDސbl_ik.VpMVic JtYߛ׮69?P/;It]kRqnQh`VZ(*́6p9//;8(iWjN؅ J-bUUb2"RI & h+>"ǸZ|\&: =^R]5b,f+0WQ4 .q לh_^ۗ\p%x-,~߱Rgc[q7 c:"cbl=]wװ/ gλǒTz>UUG[K3M w d9 8!_ozxZFWk< -zsS#k4H󤩣9Unn P\,)S)fT=دstft }O8Cpq[yhhHίGQz}imX؞QEL䄤w'lu۠&x5^4ʢrɜ7s~YԐA'OL8mrNl2Z|TW,+s}K4? >Gˋ<&)Z ?0a<#A&> -j2oY`8B %DyT'ZZuvƑUdvB=XkwkwD78HJJe6lf8$~ ?cQ3j$ҩ46H[C?)NHpqF0Lם \\ =td "0@}AEU6ecVXrFqVMn /vSn݈t- L*$dIXۧi  E7-74䫗oMZSv.g b?a<;73a'ipؑo3|'B&w.) M:5!>V|1|>1c?;Y{CiYe.J_@]#!|LcmAKTl>t1즲 PAg!񐈽DnpQ+7/7gw1& r44~~nhMܒ~U$1핂_/WoDG|* ,cjqYZ"8#ZMCi'B Z*yVv# [/ޞ"x 0#'ĦT[FJȵY萆R|b<܈bYJ0AfO&;DK ʷWS4$"K(E%JDyaK ; vX-grul ojJq,Ӎ5816x< L@iԽ,h1f >:^C#WP8mYxK76,lO)'ώﭔuZV"Ϟa]f+<>)DJfVțqCS'3{m+zL7b%t:Mh4jWyg!=lYU;Umkăh\#w|'DM>mTTD=^/rI'c,-EK|  g|H;BQ g g1x&w:r.Q9EiVE\RT,(O!׆kCQ!hh'o9BG :ylvt"e7]|LBq#i:3dr\d=@@vcO?y_ɟ}kX]<@$)DXm|k+A)b +gfyXG䳨~TQ uSG$g6Nx˼5 |@u.QW=m*8B7Xv# GQ&Au7VY$]#phxqV?;s:{#]+0yVVT8y]eg95:[[yဖc#Z@M1&GQ5?c/ !` d ՟6>l)B]utp]IHd^EцjVF} gNlؐY'܄0! U:;o /ut(j+[ui-nŔ/ ϓY"{VV~þ/e%3` I*k>SxMiֳ\] E,Nr4EU,縁1BD x y%ў.zZ8Q] ~;F6X>J1Hd̏ m&Ig?}qwaCL5Gޒ|M7Ӳ86ex?9,ulļ]R0sNYg)&jCu9L2L:SN9{OOb3EOȒ?Dk{[q3_[qn5. yۙZm-R#w@ W}15/ю gU~Ղ2y:/.d4ʴSBc=-\vZ-E$@PDS9M"f#@Lg+<Ȕ  ,޹=0p"vJ~_k(u 'dKo]k]'w]2^pHpUNRk''}~4)"~R⑒EE!KRMTFqTsTOvɐbHazdzd]}MQQƫpatqWqWbwt n- >!v[;32ݱȃ&oxTHH.8͌7ƛ 9Wθ? )>D2{@vmTNq" ixs<֠G<&Nnb&:I~m -gҗLKٗ™ʊ|眯Q=" bE'" lMwgɝhO);Z4_,k';"=2YTF 1t5I ƿ'B(mby/| ʢ, W)+IEE߹ڣKWߞ]9kqOl\@P&ډ>+=L0zpG#3;1-5y力j <^۝U58+U8zQ)=C²^#WHxڒڂ׆XC,MCC0ӎ##{lOM@^SN0'72le}.]&+zKxW~q\!QÑt([v/~FI$ p38!5Q[42$7|v6,hE1a32a'IaO<2=^O{ 5:^ T{z b{t>լ3.Z$+3%M-sq~ Zoɷ α+L)lŁE-C2{HzN@XGC]FQ ӋXAҾnw|,wqX,ٕ;[eplfU!`d.?Oƣ"ʣf E5o![.=O oEn'oh*M%}g,N<; xNST6`rc-۸{ό,2۱c 3affj05LM06 3383fAJߞPOEhi=Zv΢J*{,b}wl_rf^cn>K op--ΒNX^;F<@2}+M'hE$Ə9d@Qcržl>y3G#@ oDalf}utCrv$JƆ(jBvh!Vh|>9Z&qAOx+Ub|m /Wj{;coqU^$D8Z^>u},YjKKxTV65)Įޕ8{K($< "g~.6gl ib5pbGx஀wj{xupb$5t GD%,smmv;U4N#]}zNbl'ۇ c|=rsMYhc wwj*(옂)xD`%3$3~~a \mJD ~tn bQUq*zm)keyD7dv[0j[n -Zt' ڒx S]kr)o#'?3U>2̨]94!E}:.~I|bEŬR8҇%ۏI Z)N4ܤy~Mt<$ߑX6КS~23{cmk4 "%p* H|~ikx#TEf,1_o0D9xۦZۂA2c頓IDATہ/s?#A_056r|_#lHf!UzXzfW:,cΔ&B[5{>m9DVOaeh(*?;e:A@)$ڔZ-]q҉˹K^Z-ᚻHR9)8Wp-i/iMOY/Y/qq}mmAyHD?Rb#D%@ь =TszZXNGl6ے!)( xj"{*vBslC60wqљіtٲ(VTn9Svx-ՌةB#hqϰ3! v"15kKw2xO!]:f+zbx«Hp EaJJkBcK36?K{߬쌴1֟>k˓׻z5Flh:SS\OM8(N':}'2#g4%nI`mvkyvw%i.Ԯ>|7%$|*l8,CԔpQ'՛)o)OV^֕o>k>pu46_%@? y#HNi>QU&m@-9[)z ν1um5l5t'݉!Bc1%D2BC#QE"AT'K̓??]@I_V@};x=Z%@ ǩ^2'&)\Yݹg'NN4/יrҟZ?TD޸l\cݎH(H.Xme:k@Bso^Su^do5\Fo_؟mZZ\6J=6kƩ?2ǾDb *%[sYѸܐebšӖܤV>G&>$C Nb LN&t8*@&v҃7&ả8xᘏfn}z}y9s#l -Cv@ i?+ih i@|"5=ؒH+s U\\,j`ڙiee cw]IJ`: u3P]T'XtЩ0V$5|U-UD9iʙ#"}Q ӺyBu{)p!"b'UGUٞ&8xGi2sj#^Tl&S>˛WuPhD)2 B("$Kt J[dI )K$E&? dl\'v|6Fr!Ơ7cSLr 7YD*L wU4L؈NH%bK|7|0M\#CF ubn bH qkF+q1TR%e*ImoM邍9D xHڜ}̬):zv)}b;f6*e_4}YY7i񴏹wGswG7״6aI]XT{eAS#'1Ġ>߲3.G_Q(~]3[yU|6[MQh-uϴ8,KRdpvoe{e{sH&,8@HGp'q p)5Q(/C&;wll72XyXyDh²ZqSkHRFmC >r;%G)U@!hSU&xDN aHEsҹPRT*cכ]/Nk:B rH]4|.\uv<翘~#z9KP»nϦu>౦:ʌ KȖI{b9Cn9;5oeo# qDžiBmE" ? -QMklIz@9' EҺXw쬉C"<'𢫰G,LJL yO?d5ߓ+ɹn< ĭ'c\һ\*;%[ѻH)P@apV؉Di TIobjV|RtP圩'%A>|dgYw3NWrE$cWIe!lvj׉~WGPsn}?鼱tL)[WGMT&KΛ yiRfyu8/:+Y#.o=/ yZ_=_t*F)wg;!_osb?kxf,#q3v>a}?rSnV$0""z-b<',tV]\z  {lu'Ȥ!IA;%.8 Mw"[fActҘ9 lVo9Gt\Ţ/)ZdD+(X/2yrҍkN64bʇ+c2^c )!"eڏ Gl#HIͤ#8?u~aԔ4a7>E0Dry"yMb_:ޥ5 6 vLTWXex QG#x~)Kg0Ŝ/p(?KD׺R=찃!ܹ).yf.Ebh"*?O`&`)y{90r!E`1~~Y܌Αg-&?e)J8e]&• zRG$eE¬W *olޫ+.s)#mʗ*M|]Uyk6^_lF-6#ߓLF"P.Qw@Y0 P̹8.oTh0gG05fiR#ۗ-Wj+Ke0ÎQ[⨊cu%:^_/5b ;5414QD-yFȂ77W3͙Tr8@kk|vە, VX+_+4pAڬ7ӤOĠ{eO)3wj<ȅtC5g1a өGΉ㡯mgz ITCG{1 mMҎ': +{qTBKz hzNm*%v9<ۅW_1%9Kc?1y3H:8E[KLƑUB{0[NyGϜtէ3BhbHs).IY0I}GD,o`A*mor3gKNiWm#D/bvʺۼV Ϸ63-kQs Y}S[ۯ!z㻍=+8};)OҬθ'ﯤoOT~]_{3G4JTS 8 (Tj\c$Bש DpfɟH Wޱ>;>')h {فr6e%0з@fbxKƦ GoU={,͉.i6f=Zc < IiclEVxWȱ(#CJ(84F3`P8Rk y 3GG eWy"Sgג|rBR$94B HXjKX/g}J!Њ[F8t |]fq! cVjN Q;Ho~hѶZgO[cz7tNC*rj UM≁ƽl9M[FȀL0"ǰ" kCI_Vcݦ|8i"1_-҇$ֹ托G=\@ux6aЖ:}tsr!+V~{E4nԬ29*v6c&aQ#p@] YhV˞i=WǧPKG 4ooI-HBe8 ;q֞D$t7ݍRVZVz)[6>S>/jVQB(j`wJvCU؁8LlwFmvNN̂7zވq s?t+݊L$Ϲ[r.]I QOOYr^qOʦ6/[ϳ4(BUf"RvݧAQAUT` \Re)e)}.YL`&B=p6R.J k}嶱My^ӥ3T+qx6ual#pƋ?ٸ x/fP>]گ)s,S_3m7ɽˣ?p LiuY5%+z]hc;Z QVh5tn;L1{f*L@,ѱϹ}';l-gJ*{"O]٪>ZiE*ad?XƁo¤WœHYɠ- q߮^) +83czf"AlJ 6 Fw# ˭\n,bpF_T CrY7g&A8don~@C.}^xSN\blղ//]ݘ_Bl^2(pR iWRl=Pv]:B C^OysJz^p&5 ٷsVXĆ'v{0 ;@`$,Ơ`G=aUbO.c1㼬ϯxZ|~]{7e lf"0rP Uҫ%mme C5n :. lmj{u:3+K]Û׮cey >ݠP4p9|GLxvvNm{<ӼQ}0*  24ӟ1]-TX.ge v=|{k V`-6Xub歭cx&'?Wxb+ ߜ_.f44%6g.`H|ZC;?46v2_{LfHyέ] q51 !몶Z(\C#i$> o|ةV֖;Y Fp]%h*7dyvl@elC#4?6!y?g8ERH3E.#05iMB*RaQ!{*L~tP [W/Q6{ KgiAaky#ߍyUTP dZ `)9;ݒB-3W2Yꚛb m-x^3΢PS8Vx@,<#C4A$^4 ޥ3ZOyEZ#wѻܟP|26mz ok g}~#clE'^(">l?ue[{a[Yw>_$N3ZFacNYEK2bdy.L 8=#TPZ_s9;n׷?MOd?@K Ƒ`呼1z&wF)f`f]ISQN'"Pi+𧒯nKkZ:`#륬oo,ǷΊnYTyU75?%~}BBSFRLvgU~_iE-ų Z X{uuƋn^zM}5 7`wq`A&t[d*mipSdU_Ρg6J>l f/Tx7xd!ҤQ/9(eΗlǜ^7zʙGTq9^#Pϧ3eX  8`2TB2Z+1y}ٍ[~ I8[%hRN I @8¡>N}:%{wx|BJ`F` gg5#JW;%?;k衇P ]2tD` tT3cٸq^Pr܇+DHLqqwC%F-prN\2/vy$H/\[,-FaJ1Lޢ!Xj0 EEY3+ɽ3^%}}>0\(Q#|).Oq>GxNB'" vz{{D׳ 4TbM㲯mZ fftY_c$*/ 9H%Q73fL])Or ;75 Vv&@^tƠP:3ҟ+" 'h غYoJ'KVk_]eyiW՟j*<60 1\q--hLz{ʬ|qrԳ73ѼΡbډ{ AqG#T]~V#C%,C{f(uU挢zss_Kżڐ@xY'X%痲.^F :GQ޷w6/N/_CG>Ly i%hr'AsyV]&^kxJh_}+lk83Y>kXrTcxfLaF_AC|OKj$v>sY,qP;@Y,-5?Z#TxrW l7ЛB+c4M :wbGb)fzTHj8%''R3&_5,6tD@1 ,Tء7>D!F4D|.J]vʹ>ɰI&ʹC?`1F^ maYHz"55\kTG㾞==ցlJ##G8)x3. 8݅MƁLE~iKUb]Hf$ &ӹ8)0 d"#9z3a;40]E\0 Q/)\%/4p.3WW7װ^@,`(+,-T5\C+9job 0tTg3DVŅ@zot׈iDpؙ!H1ʿGD pP#LU<$1RW^\,6[uڒJcwa 7e!lk T2e_s+=" d&!CϛeGW lH_}dW^l6yF_RFcdM#n*e.ԱYn7Тk+k6K҅mep]>Vlộv KXc$Z~("MjFOnS^pE]4u}Uz~+-|d5@}⣸E?yLP͸MK4+1.'}#}Cb'Q>2j6> xW _!vr(I#FQC(Q}|^?v졢%S==Dsܷfzَ=>fgZ>V ]5d"C#Xwcaiޒޗ?^P<7,cj5`0ēDƢg[*o8d^ %Д.c-'N8:--IU%m.3[EJ䨨gΔ:,xhOf d ̂ڲ|VШ7t}mx'D G5C w\3"%h^R2.Uf.̒EcEjeooP0?4z)]IvѤTzOGm4WjB#`RKUp~KJCith{Ojy_)-z/c$GDo<(>ڙp J!& )n_Qutt2w3 Զ.)8eˎj檐Y}dh7QtH1Zd;hI;gx5J$!xe^mU ɞbBӛܐ8f-N{m4[z}=(F <=H!kƧX+_.NtT$)$7\3'l+_#vM"5ADz!G ,` I"P 1 OEtH5LS${NOUL3z!={,X(`Γh'~.k3]ʨyW5H'[& fx7 ߙ)YLu[ON]52ڑ=+˼G%nC1t\ofYq:.&T&8护)bGEE;\k0$k8#ۦ%vGfk9xЊ@+QMXvֱUJ\B֌AZI"t=eյ7L쓤X,+,+΋}^^EQ>G Rfg ߋHxsL׭Eh1e'74!#C|*q7OD9\POGlcֳi2V{Iͬ4rr>Ă_kWcCL#]ߟHB"_'ѕL-26|̸9o&33Zۦ|,xQlr|YOs;wz1X7@Yc=R:7Rx#@8ȴ:7=XNftvxtmaN` O1秭WCL9$qIn0w>U{y9_̲W\b/> H K"ЋAEϝXWB W e#WI7m._s$}%\#:sDy{7) B֐>xPHJ?Jmr͹`E:+ rV"0q/zOIztPd53(%$YD4NY0uۇc"N*,u(P*GV U$}erhflLvlgGqG](櫙ǰ*i wb|;ft7^SFm4-5W Wb]w+> ^#\]A* 'Tcj0tAj:ʮg9s>ܹ^9O'eEO">==3)* TtKft_}w7,$a-{iۮbu`ъCXyǥ)gVzwDE|=\Kd= PQ N70epO,?cj,}4&G8X_;GMo Emdm%txHeKh7itL@f8;6G?8B[1Ia5 Meٗ`wXF{:yg}߿T<T md'C[9Z>gle'Qlq5t 5[V*iv>75@2 C-X֦`LuxՅ#ă[J>/bm@!OtkuZZ$}E9-gNvJSúCfUq)1omq%yL?!.ưA6syuQ0==&'խTr^&  ɏ&{jn]kI.)eEK ~x;v+672juR]Z69a+`zs=CIH8Gd}勲dw`poDÈ:Kz/ kqd% - ӘXqdl7[1H"F*ۇeƀܛYYA}uzHIt(9TxL7}o9(6L"SaI'(gouKvMAl+V.;푇20`򌥚i^r1׬T;ݎ[{#|)}'/sf=Wyl%Nҫ}隙=@ bH^>GXOn )HSO O1mOPW0LS# V-9"QW\oNr'rg*y?XbN]+ Js29ϮOq5`Q# T,;989;v.&G쁈^P[5J b{=CS=xxXcq`}aattKQ7fo)g:[H0e]{B^sPrv^2{Z>xbZS48!-Bb 8"=SWO sY8!54fǓj=gAqLMӗti3ӊt*Vu[ AmF{"l V 2 >G;V~е՗50TCM:GŠ}?2gm|IkIXtee9ΧoZP--vΒeJ Κ]`]Jjʝ^M?aWDt&idIT6dqum9}EwK a,aؕC @hN328CE)A?rUl=5o>9<cB(Xmy%͹BRs+jnآM۷w;8~ ~;bIԽʽMЈ~M:JYOj^No;.;w)E2xOJ0uv4N7X҅8vtQsVkTCCͷCo7N[jЁ#Znz<8i(0HӅGt$^楜 "t$$Ĺ(s6Ls֓ͬk2+Kx8(9"ދ-/RLh*6:c6z9wH59'?Һt)Ȫ*ms,7 GLe l,wًd=*F-L/ :[!-kta5|n+'śۉP! 1[*8IpB7Yq@U=|EnUS]i4 +}4MUkUs%GmpB$f+cYu9nG_dxC<DyC)zsEoz9k]+g7LA)ӄ<6$|أx+ )ocfJڌjJd ;P=򶤆'6G]'I!1eU+#0DxN]p2IjnC |K^ 7]]~f/A! ҟtFF=taU6@U,*Bגb}Cd6C\+5q2dj Rs,@ܑi\GrڲeJFȭXյxcQ fxnm>x)81vς(, "3;|mm!7NNwZԙ$At9DJ.B1줪iԵ2?_ @wr\ɯ).@r@-1(/@,()X:.یykh)"aVG +i_w}F{"^'9u磏JFD)|⺞rsG9zطixs%SI w1؀(dsِ;)!7qR8c;kge_otft25ee[n<쐝g;K Kؔ}(A HI8#^zO ˊ*Ϣli$'fxASm3r"ӛ #(lpC0g]8 }X[n]=]}]}'[@^ 4uswQW^@k8J@i霡u-H(. ӞsOD x6[γkx 4u7pQrÑ#\q $;EoǍHCXVmaبF4nCgU.ݺsm푸Q(HMȾP$82Qqi *#f&bMHG{1WVa=@1$`乱ٻ4Y60 S"!!oǸCu6|?>: O-fkwXM0MU%e1˲jIR_d ` [?5f'|s;/E8wӮ6drU=$=}BGf8eg,mssj?V0*{7Q\*9>0rvfw9r{/.=J'uF 8BB%pGc Ơ S)O )V7(>(^\|TNV;ooeY8`6zs4-Xl: h %ewxKEӨ*m?mwI,x{$z%es.Tj{=j>%ߜ-n}bdp0~6.c#%sC b6]\FzKP he2f˺(ڤ_0bzc:wִqk|xb}JEYvd>[D=.6/ϸ<5MH\hU$#S-MאύL Ĥ35V JAe"Qw7HL%Uzu9yFi^9TlW-.V!W}R񉧔'}=p 4T3 ah.{ j2AAX@Y6tOqқZ/)J;$2DE'5L<;WrWDU `FrߐDv:P-t $i BqšD)XP upђ vH-K_҄ݣڥ-a(4}\}}'_An&vk?QG,P!NA*a8\e@A.$*GCLjֈD=XJFrqH` Tv K*U21^2ޣߔlsrQ =ܜ7[QYeGkU=#] %0۔%0Ϋ'W$}{̲3Kj#FCP;13]r 7D%du>G?8{p>M?)@/02 Xa_'N߹O8ONa/6DfD# $( fKpҞ4*5.Hs֐dȶQRWLgZE; L+uou {^OۃwQl# N^k&{8H@YLrK5.ղˣ<@ɣ" xJN1-4zjۻU'W)g{6%W=`lh^`9d>-1 8/|E#QP 3Hdj1]?|6߾/xS2-cմ.n blBO7ї%LD'aMީo_6ϏS^v/8['53^I]h^R/H ~[V{󐬥IMo2"/eFzde]8L4x2V3mt!Va:x&3O0e/#5-zq5b7V0_{QVIooU}^?VPk -B!pj-k|ƫ:͖{m&7 3H)~yWE"[Zy9kmO+1ٷD/?p)ToiW>/l̈YóJd?>5uDsERNޡpŠZf&ɂ6 ce^ 4Ϣ3!7d'fJe鞼Ӓ\G &8BP=WlۥTAŲbg.@#JX§(Bh,gt&$&O,SUmyQ}Rv[kkK|%tSGc4AS5PsQ]A2.ezLK"$nvxksgHق܂ =gOpGهƶ~#7PvL225pvLFL3tUxL.BY=g?ᜅbV2v<ӮT~IBv7OZ(Dm|P,p<ԈDy׈(t\q(^n<·hUPLW^.r|k&.SqM5ĉ~vp;dkKYqQ+^'2_'nbN}/SLƺ+Jju!^5[4o?x%C(\_6ꋾ?d>5Lkd/I%cOJ t#Sd`G?-ߪȪM 44ӆdO6xv;Y8i8@s(ZS$IlϏ-Tyˤ ưL{MԲ[<{NkL r-}ciZF8ơ-JK#y9UՓ9# :ϐ:.9O֢aɥ$trAj2s=U9^{ 44K9 P0LeVܿ&^@ ,S iorg&.6T1!> &|bdxJz]?뫿PThS5r ۝ÄYsGQUt#MeyQ]7%=HYAm -&34 *?qPî;f% ͷt4A3)ҏ=x`>+ӢznѾA& SșnvuaK%|`/ꢃpCyΑw103q r mߑ_6ډTd*xZ^T~sdydxxC]swصl^ HyGß}AS #Љ4$>|̳)iDĦ|IP *1W6i[N←55V96Dc*4yXEd""L<]&}2`2;*dw'Z%jp<4"I{m1uweJJPJ}d#=:|[_ڎn͘&:h ?="~CLh!:(YkRΜHL7Xy wBd" YiWY0!z\ޓ}QlӨv=g>l%@+-+P61 :yޓϢ1^ nrjq #Q?0{_s!_⅊fh*; sm VΙ Kgr;j=0RF׾/ :9(x|Z6̍&"B=J{TY4?( WU懆WVCHڍKF6)G<5hQ QGYYYv0M@D"xgpBj} ƠsUͨTbHb%CSڄ~AmVD2*_V\<+C]Y{ޫvx`nZD4]%Fmh~ y|".Cy? Q&7$q3~1?ɻS'NAQ\l oV…gCIeRYGa#u؜6?eTY,/>{},8dF1]+Ş}=5N=>͉E,GET.,]:UC!+.{$m|A ,||Md3.ZSF[#gǾ QP ZP$h8S7پsUBdaDXzBCRH5TЍGz0Qs6sE]lPZ$XgVO[ =zK_xggJhS{fwh慴C#[iG_=y*z,4~`eO*'[N~@!Vvb7F@W%5.RZrjnVqłqR/02'X묍ͨmnKY5(^tc&HWʫ2BB+|?fވF+ؐLb~~QloY[qhȠriB޿G{;Kx˺> ,xwֲG/+w9}D;R,el\”=sW4tx򠍮OC\e GqQ/췍K 6SLa01?R?CA@OOS% ?T'_/r gV͕r-E|3WL/'g>Y&w{=!al[ɶ"U4kdih}][]5Jýg^jbjܴvcoQc7r鮛irFkRWIҲ^l} }(y\!dj*6X@9X x>;'0%#)PzLNљ7$UZ\vt0B&u fSa򛑇_ _9};k㔷$񁕱I.b ?D;gq g:\.rx4&zxoObS٘uVn1r$w'ǘj݆aLd.JashOr}ݲS1ʒ21eq&)mPe6Iu@Ύ+Ff))>Z]|No}>`oL&~] P=bD{$H3\\ G ",w6l?묮)xhb%P B 6r)7gCXJ/~;L]MGí.gg^J7D?/IЁ&p Q,QP̂R(ԕ^63KNV p =h*0I4(MjI [le}},msWI2ZoE7^N5T7T|m6b{߳%~Z|槃gaʌ̫~F| I7W=/_§ o'T]Νhqͬ+J-+o[mLKUUڥ(:5V{Kyĺn8ĺ(\~WMYQ#V]dM6M~|WTj&;vrti*@VJdp0Md 6뿯\4 ``qκ6YlQ&Z;)Jv|d"LЭXCGA=EtBz" D.tÛdL 8F\!T&J5wYe-^\}ҟtv Ҧ\t%79CQtMj/1pB"b&vBdAkR T9~}_a⠀-c¢(zb|r#;bY/pqQH1,vRCD{s]#bo[C ?T$p q&va>*QbnY!ѱ1H7̢imWݙ?9+UшAo`$APŪbE_^ʭȖ.xX+*~F1M:rIšDib>q& ˋΟ#w߻pr҇կ^-26iMқI[Hȷ)5z~I?h?u|g{-u'B:MvywCe )zdl|gL)Q+}㗢]F0D,Z |?Opހ 5(|YifAo~ 97 x/Cs&“Mf~DӤ$WuAC`Ť<%<Bݰ5e""ZV6Z~*RT]*ҩ.iq/O NcrKaͱcÏ蓣a/pP-kCϣ|\,oG]3,|ёSJbxuB'Έ$24p9 Kt#co{>Ue "El P0Ucu5IG J\ՠ*VqG5i)LJ;zΌ/p²AʛyHs( |prR됭اAPF#!Vac3Lo_E#o)lԬ:m0~θx:ʉyTch`^#GEoK<E=#ul-e".E!^Kj5;sEZG|,uP|e6*dbeAflQ3F]9KZ䚮75oGWOVZ%t0 Fnc l0 ]} +a9N.n+(J0E%=-YsXdbcE )}Y=0Ym/3*ŶK )2 sQ! "1K<؆Y4ZOwY;;QHjEM9%4Y3 X}lgI:*8$:mQF3"d(pt6|kpv)gUEcM C)wBL| x%`nd-~ďTi3MrN4,BW,ena뼶 8kAS0UIi^L_)MA|i~o;`~`1JQ^gW}<3ܚZO=84Q;]{3gHxБ"=l7[Ѝ0R8`j9 ac)5fBSyHv0DĂa:)ócё젨MWe@s%.ͻKg\Ydzh?ke>"^ZNETDw'Y[edѯT\!f䌜h?\'i$ OdȖ*8e:r(?!FXF0W82IBh&1:gcj:Ui=.IN%g س Q/@~td/ƒ.w;nAy' #@'aް&,φ'Z;cv2jInx$$UU2$,DCZDP[doH+Yv[M=@pHuSCVò>o["<v9y\Wh9v6KH*ķ <IbF~H` 6AÇ' ims%s@e!q=͞f {1{NɫW%#Ga33l,UESY,]s9RWPvB!PHxP p4Gk3d9YlMxu؅ؒʔ L9/!/rrM{3nbz|{`Sjw[4"f&gin0 .]5S`jލ &J7:fS?'Ϙ6⎚o2^5BOl-gݫtʙqߠ_L]@m6fHԒZx?,$!fp#ÌhK i{_(g"V.Tx,<&oE9s~(QU9mhV}'-3x𠨉3噬k4FQ2YL#P i"H"}%*E HGG!0kEGeQfPϗXZ1$X#ER[Dy<>Xh9\Q|g ~~2wZHiE'H)9jHk_@1pЙ[d_( 7}~3ycsBg,WK4nhnO} (E4Q#8:8Z#?B2;((Bs@et͢~=zʻ4JidP-GI8&8?trVZu?)ٴ6!"L<h_&[HU'hr1ǺX+kUF€Ӥ&0O,\fs9~^مj u!kqd^q K 52TDQlME[X)MfFbwf{iihx*4e%gpB7`8C[N;P : 1g/j6D^6JGgI$93nH]o¡pp=D:r";qbK/Ԁ-E|Y\ŨJBQ ` 22otREҔ|5w=pOp+g{d9*RxH4 =Va,*c .+,Р j#?0~oLKm51i0} W tK 0A҇S@ Tq07KtoA@n; +wb': ܀Wy<~HgSgSG#f\u$."o˟xBB"5X_"?:~Yn8Cj؈v &#'#އ,;'8fv! we @Gd"ku.|tmopFqy6p=Lt>f› 2?폞4 Qφ@J)տ7wT5~_ s oJ(!"vˍ7- ׌`mBjV5O(W(\Ѝ7nܸ'qB7nܸqp?`m XG ۺn@ƍ7n7nܸKS_Y9WpF{0Q=?@ nܸq?;qƍ4+e jG ۺn@ƍ7n7nܸKS_Y9WpF{0Q=?@ nܸq?;qƍ4+e jG ۺn@ƍ7n7nܸKS_Y9WpF{0Q=?@ nܸq?;qƍ4+e jG ۺn@ƍ7n@Wm3b)Ln}ƍ7n$8ZyKytL;(( l+8p,dΤ3L. < Ow tƍ738fdL;BGߡrp¿`l˔Gyo[,) a?b.]/_ȿd1YL&a&N ݄By[-o0!NN@ƍ7n~?v`v @:ä: 3DVWVWVWVV> YMV| ʫʫʫVVV{ ^lFƍ7n~? 0&h& =KHH<=2d<O>co@WVNm3ѿҨ[5W㿩e }}ZimZkTB%f&l Z`i+hZV7%؋#8،e%䐸lq~s.H& f nܸq~Щ=8$ oo0C1VfD30C:ȅ,؇;$KGU%=f8V9:T =%d88ȥ :5=pN51A8(@ƍ7nU\JQtqFp0 jzm6i2FDOǻ7m)i,a$IN˞5 wjυ`K`yîe01!AcD e__;íD%P"H|ࣚܦܦ.19ceXFLXX@$|`V1*Y*U:_9wkqh<{<Ŵ>?vjZZ)շ5Tz/NUfPw(\eܸqd>GƑqKKKyttqs5~^omOK[zeqcݗ)6 p1dKHd_i֒K2q͋>K|_=|B:I(\3B7nܸq$DC4DCFhX.E#!f 7k cywVX0^̑  ^7H:s/#-q̝Q/jN<4/rdɘ"n$ } ,0C9 F@WVNm3ܪ)Ln}q gL0/xfha%*%e}n#䈏@[уun5[\<ԉ1v~nQ'Q N>0hku0<+.3G}䓰Uv3nLb'vC 4+qƍ&d 4|8·'i>+cr9 MmXkkl Rycl>3ԓל0_̵֓z˅ KfEKEn/Dn(ZBRj;/oUxUh rK''bҸbA]柵-yLS;tڜ2m⸎IFPCx̓BЍ7n8Gqb,܉s'vJoD5ԊIc/Ϧev79"]^^ru5|$kllwm7D2T7Fn8;'eaU#QCN4>]rj[!,&' GiC:S|2w tƍ7* 0*3%Q%x&'a4V=%\UEsW$S0 7R;ìR)9ʢOb#kHқMLO>pMYOҍcg`/}|m6rL']mZG˒8Ҏ@jrd 5~ۈɿv[5#mݿ?/|F̈vgؼCcdnCiNϙS~ )Y7Hmʟ%% aӉ64:sWR?IT -MBfͩ{%-,L׌[L&%"aW\FԌ 1mFG.FFoQ7nܸo\E\$#Ckb;k;O>s\#{d3t}/E?Y4C0b%a!ܰbNC&/)xO,1 bk0!x)\l =C uB8Fv袋.{pGh=QzWyWyW9g9g9gQ PMzN8,EOOO ,`@E]tŭQBb+bnnnIJвв~~~5p mIdmfR*5ly%\%~tI "$HE,dE[_ /BcoFo_ۄ&4 _9UGy<+/q79{jM5^CCxkL\u{zz5hFҐ&EG \; E>$! I&[AmIw6չK\vؑF[ZV?~XuӀ4D;Snl;b^8aF2JTRT8XuX'aZĦ[EHHHT Ub+G9EǧB*:Ď>r$HTMT-ʴhCb,b#BuD#oD#"|` `|̿g"88y]Nv,0χ 1+Rr)JQ*j>QH"=:D~O 0Fy?k7߈nV*i%ZV*Y%d%v|_."a5Fi6͆ZԢ:BG~a_mlEƲl'Il8'?- SΣէZo7%P%cۏjZ֠ըF>/fDL)SʼG9pqX"$MMM t9=@ Phohoho{u{u{ViEPY S1Sii /U2ak zO:YU*bX.jjjk5^u(J4nY;-9tP:x.\T@u:P>wopopo`O'sYGq~,nnn?9>>>-zK-߷|jtQ(]linini|O)br{Gz" Fb$F~C?xKҾe}wkޭϦM6ǸǸǤ\.˕+|3|ma@lVrhZU٪lm[ٶme旝Suz}޼ƼƼ&ْlIT%c Sx oM =xfL)B^Ÿ^ċx`'؉p{=n ư@1{1hm6@`8e8e8^UW}}}ćFQ{]B.L[IKx񹜞K{.4!'!'!'n*Upպj]=zQJuRT\"7)5\!vHiUZV l?~2000&&&yb䉁@Q(vlر"~,Cmy Pfb&fJ"ዄ/|>}___+JbX%V6MiSR Ojj5zQ'M?ć0!ct`CMaSؔh'v!R:AN b]"~ sE+9p.nOOOߕܟNvn^dB(yoD6`$(D'$nԍpN5<%}I_A#h A4&$O?qi҉K>S>14@H#}@C1#p{]܎XRH=PPR(Rh͠d%+Y#ux^\+Zz1S1AoHHi>'#H2]ylGҿvs8s=wKuCb(FM;/ +wZ8a<2Mv# lA `<>|,BElyr?ݒ"9S"zTXtCommentxs.JM,IMQ(,Pp 7}IENDB`rickshaw-1.4.6/examples/screenshots/logscale.png000066400000000000000000000561771225123340100220230ustar00rootroot00000000000000PNG  IHDR,EsBIT|d IDATx}yxdU{Rk*Tnm@DdqcAT26#8"(3(Έ 8 2(@7tI'TJj{N[Iethyꩤֹ; )DTP@TPLQ!XTP TVTpĠB*#UA1 *A`UPAG * *8bP!XTP TVTpĠB*#UA1 *A`UPAG * *8bP!XTP TVTpĠB*#UA1 *+H,DQqR)BJX,W^ygTl6h4 ˲F4{9]rB # a @4ضL }?m[uk)%_U}~m{BMߙn{.,ߙ;\msz׿z(^/4󡹹؁\.)%<O30:~ԃsh .i0 ܲ4DOc3[to'{9m59m5яJ\y%v-p? ux]l8o'aŋKn/Kl(g` qzۖ%FG%r9+'}I'vR)'[ouO$JxW?ɫxx<>Aa``p`j,\:u'!.Wi2Mt{pW_ y)n-|W ^!,UfrDK `)H,YKlG~alʕ< Ø2s&<6j\>66χ{\ݘzew߭_ac<:;ueI#x ,Y"w/XZGCzCCcwL(%Yo{gu7SstWB|0Mpe^~o-` X^?uuz@m- }Jw/aQRJ$|m@?peI .~n| +`'yA~~=A{Aqd}}@s3=uō7x}\glb@]1}h?X[4͛+ہӟ>]a |ݿ}sI,X80> %XdL|ccctk {g8vEm|^?>M79?gMc;vs˒عS ;w~=p]B8j77]ą7Q"pYe9˒طo"=m|{(dd׵KҝwU C#/\ʝ;5kkjf?Z 7mڄ_|۷oGww7a6,˂8>$`":~ g4[ITQ5*])R)`J~VW"DWƁY %v|^4ߟ{wO?Jl޳W6+qCC@k+GbGΦx;O|B쳹A_%ayQO&Gr5<= w<8Cb_.[\x!p$2=El`l–55$NR8L@%.ih߼Y/KmmWQco$P'x%`r8iRJy455!N`xx7K`y0"IR"L4Mr9pk㳟ՑJhlpy6}xI,?_{52~Sݖ7a ͡9t ۶Xkl$'@fmrLҒΝ&r0zu&RY IR {*eAՅOā6.FOR#p-?7~g w̛C6k@ضMx4ex?2M555x<ŋa&ƨjh'x o|D_+V@ K/Ipeh- USC d ppi|kz̛,X|C@$Rz+WzgpDכzz!d&S4~Kxw˖ $&ƃ1r@Uy' /o}k}l[=Olp9mfl|kg>![ngwvE}̶m… S{;0<ڵD"W\ »N=]}:ɹY<0ꫩ)UW [-׾ƽp]x|DR_/$qe+Ӹ_À"g? l qiXXb2O|TК>IX΄+x=~##/qJl2,X X|9Lt.:0(, Ҷ!iȱ1X -`*K/>QNCroHVX.#xJ?{ÒO3~s ؿ8X.}__췾E YgEX]_O%]w;ٍoD, JDqclL3lj^|.&mĶ6l&7%>ianґ`.5ַrR,_>_,ja$ZL`j+_?e>k)#< '8XL4@s@}MTUH\Ҷ'[}>|QU:T~3]F۪U$pl:bF>%fo_f >BP|K?^3K-M7x[.x9(rO">I+'/ P[+w\~9ɉ'r&K/zD765놆8|bK{;Dx{>thQP#GK u _c}5S?il-\k 45 : VWu7Dx@GE7 |s4o."KwQX?^ W` \z' B!p7wS7OZ yԄ]dÛx]"y9pMbkWq^/7?3?$ݳǹ&︃a׼$ڻv##fyʺM;wr=FqdMhlS9k&sH!GH<(q6ǏxY>O?MP뢶D)(&{22mmW^)PWJ&&CqN@.GT\bA{ҝJ .)pݸ9J!.T E9xfLL) V>ϢE&r4+sI "@6sz'd&ʰ^/kj"޵,-?'%Q, Z!7 |#?#pQ<۩_l޷Nsa+Zp.NUU!~Ż7bo/_`80}ygsǮ]wQy5@W׫Cb1z=Ir?4p}$x<$txpsxJ(y'wC(&V&NyoaG @,pu7D&ΎPq>d\P|ml} F ,_<ŋ'ޟ!Fz+`aAUU(188P(>A> rcc \ l ^ءA&v,hhj (X&4My^bB/ qiRBK`]s GA{߃/Clli6Gq9i6|R bxXRml(MӑN sf=ˢ݄X: _#ϋ Ͼ|]wI,_adՕǣxrP˖%c0>?XHûX (Z,b19d2θعSöm6x@ࢋhVOPWOe}tƍ;Py@'hb۶"DSSGm²,Ro~# D}@? b6quw_Ѩ ]hݽĖ-9  m@Ms`~D<.Lʒ~.\Hؘ3(r550r9XĔsuUU!cB&S:WisMw\^:rpLYh4;~O6Ν0WDߏa }tiV Kpdhn69kJY_5M+>l0%~\xÒ%K #D+ZZz!`]a#4 #8Xj%S-9f&RVUp,FKd(/ py4AgҵP4-g咻wC^qEcQϦԳh&oc#U(## @B$YY~tX\.E}1M->gCPif着(RrEx6'H`p͛i{{>j IDATUH9x˖Qg qn10MOI`=4 xh39X*ς\.0kr`B{,tj5OKr%ojSfHpCud:elUH$D$spܪ7@=k4 16Fd`I){nttt rj{ ~p`"lo0Mfll@x<0tuL|Ň zXQHTCct"Q8EOImM xvwÜ?)_=T?]r)&9YYՓ95{<5=f`"m-^f.OIX:JbkY55O <g?Y!i`Dbn}ɒ~X;kbisڵdf{^ykM|&LS`*k~OW+["qd20MҜv'n`&ʕ03kjl Fc#WT>}l Ml/O0\!()N*,f8 4`^/ My1d(D.U haf!.f<6y q1:S,׋c9B0w60xCuPb<0 Bo)wSҫx|W$6m!4c{OBxx2Ȧ77; 0Rv޼b_cx"Q}cq#E.e~~;540ߗKf0%\HwxۏRc<׬T\Tau@8,m9)~{"GWt_Lߗho3:sR?ྛ8,euD !ERr&@&릸 z`,{]>ρ㠥R(r55O<:h]:8~WP\ hd8jtJ}(ELʙU|>x"<TWbGw'~|B"bSd{M8Q9R0ۖ(ItJyJf`?q麘:HNvpE4+!꺮.Am-A2)ԿGti!@\qSBQO\o~CcR6+VB B:4E;lNFIY׿ ', .g*X r"ܽTU)C!D2Im]g vۦձDzae&`MjWdWAAG',ꏥW:=1GAЬ&CabzH2 N:RJT޸{B~smӄ,ʻt10xi 1({&hm2yVl*,JKeя#ae9r0 }nbLɻgQaf˼b.utg' I+*ܿx|uAf2\\z|'U?$ZqSHIwr` ! qa'AM!%4s|-(vTpmOK!,Qk_ƁWډVSM(?J9! ܿ'K qP.sjpxfhi!8hzj) ۍ6n{5yQ$lm^1,\;9z{yg!)J^46$;ՃB nnaة*VbdƸΣQ.r92 䃃EIGީP\ ^R1S9uu:rRa㍍d fPFm2:5 }C4G;ՅB4Z*LRe~?']Ubr"-Lz| k飴lUxy@SWs?|i2tvzDQظNG4FG@sxHoI}ʣv26RwEOwaY$J L$w}zj'N(|*aTHEnLN)(a*fi]G N '\UUDT4fE%j$3X@οM s`,:8l Ȍb^)z}iVq ^z$ fhogN)IhzRM*裬zNrA*@h_] s ʙrQߺ{wә]w߲8sF"dUrnldL_=TpbuB$nGĔKJ 6hljjBuu5<,˚̩i ^@4  ֮ƕu2,n|31 |,Z%!jknAo;ƶY'6iզ|U۔R⬳׫0$X,>N hh4J}@FE"vI<'?9}יవڝ7,Z؝ՐMR.5Rv&a YU |9zy΃Xܹg(QS@>]}l'1g ]0 p! "gTWC @ òm>e1mT"JUU8?Wb!`Y;Bt^x%cj$]`A,)!mxiGQY_χnhWZiKבaxzzww h4f.H0 kk!"HZ˶arȫw)Jr2$oMe%CnӶq9-M4 ^kٙy0ZZtkAJ^UmF8-[As6W)2L]X GmfCr۶y:H0 탸f'̕m\W^A֭0탵z5%KxE-ZD08H\P  A7}nv=E >)Ⱦ>SPBNaͯ|cNCa{A3ÔK4 ~XX5'?Ni Teu5̡!>d8B!A'~[nڼ;`^{-~Zj|>*MG}=uXW\@0!8qNS:}Y9<,\(10`BӀBF$mlMyfip`c 3'2s](o=f~*?~(m3Π…/¨`0y"y+W7N%*ټV7 / sR: :{S4)z70@W QPSC XB ߔ?\شɱk9ʩG ->UG6;nF1z쎅BCڰqlzzVk+_`B:Mf;:`KA=20@@pas!n; ˿8cWnGu5CBECDKɇR~;w'y,0EQ|2Mc!rT,i.$zJNj 45**jjVgRC^}5Y|^ ---)eU\r B$W2I73D8L?^r99QBI{/x e5wY+}ۻҞ=ЅAE:RehosO)*k 8깜CZO?)Epܧ;-*q*Ծ^)`)padıɿ 4+p_|`^b۹~a]_(7YSXn91~nTqKч>=ON&)R:@@JYrXX[dEHN))?.UZK,八IJ*Rŋ(줔$X"}ZeqьgGw<"?,yuNwj8 7EB~;4P]-p bo jw(56FQG<'Y$\7y$R#JKk}64pm74`u_"Z[uɻpIG!Ĵ:[I@1c(s|%i83D] OaMYB>LRbE-zΆå:O< sllܷ_|cŽD6 3?>I:# e &g P$B{ys*i8\a10,YBwf(L֢'Ueˀ;yZ$Mػw$ g)%ߏ hT\a:Voo H1fieM#e^ªp~?6l̄o ʹm;vY6˓pbrγ?~͐8d $TfNWUZWG"2447 g>ɁY]ͽp1NVAL4> љY0pу}^9(kpti,JfYz{{aYbݍV(E؅'X Nd7I t0N!.B!F rd*bF(Ik ;;I≂nd 9d;Ai9jÅlzT!L0tzU$첉Yȭ$Ӆ0e;"ĕĩB4 L 15NRF _LWY躎b^P(׋S {{{q~R),]PP2mmn T=N.9uMs] Hr%,YSUhf##>XDŻyc#e|$NTb-NL3G?œdyQCEL zS{ OnuH.ȑ|>`F~F'YPVUUF+^ipeRq,H©C@8LƢaժUi0m۷3YaVV)\ @ӠWWN&:4!~;\;:p!LˆDXEzztdg] ;iS&& anڄ̑`<< .{7QqlxKy¸BL֑ڦY酺pd 87sI|}aYliS()3H>1J4Æ Tj{zN8{y j 򟅛@q-ybYN:]%Gׁp붳cSYCU]g!X}hooǪUzTqƯ::S^// BP/ݚF$QnnQR癁n6zpW 9'58H2VU`E"`[XӓĤNU)C~;n$D09g޾rzV @m$j͇'}+/"NJr559תg/sr31=5k5稩  $@y;!͢E=u' btS.JHkژPQ:6T.utjlQau$p#H 0r(7v;v<2s'تb7H\݉*gd QX4wx(¬*K!D]_ 6zww;;~|E!sYHzf'(R$ZCCtu[R?;7FFLJpF1X1- \v.WqM K/e[L3۩r`z"B>NUD!^[ UftSbMMk`s"dLq*T*-eN)Z?klToPd kk!;:FDok:($Jo;`877_mH|2t́ ipuv#pbO :C X%wVl sӤVE#ЛWngX^wA\z)OKW#0q~5 t'9*A70yvܢK,Sx.opn Z#nnʶKcEH@u^:{z& A.K)(GY*B"6H(%f6A]&pIDAT]I QQQV-5'X q8,&٬S"25(/ZtR:-(EÄ;Hwvc|uTjV,<]G qcJWWqs*9e2H +lx9`ܑ eN5}rɲ VVW ꫁vG"fgY"'8|?bL7 0(d:e`GmP A6@p"XGQ#aJ>4%2i"f LXW 3L^$m.S\՚5a`S@B쒓A-u5S?۬P/I9H4m}app ,~-v~YLE_C)"P%t)rWmTP\B!*-!z%O`9;8ʍTpXEMD cz5S7䞇d4.Xlt> h(RۋF9@: ϓQVZ'Y:nddfE_N/y(\RӇ7]H=a,) H?L`|>ttt È㨩)VK/݁\7gmصЫ`e2SnlB-]UM˂A&ؘ2& <B06fa|g20ys96:O!&@Z1ة4ӄϳ|eAu+ڻwC ;ٳ[Mls`Dܕ6GC)*^[Xh;/WŲ[U]iÐвYRBQX0`yІ`bЪ`'kceFr%{H{`~4w2L*]__fmgZ{[|Jev1zR:<BZ4},wmO6YƷHb`ÅZPh0 ȡ!63CC֯h[L`S3d47 I۷CK&tҌUr@<>\i1Dز xO :<$Td&#XbلrN8P p>%EEy@J ͲӄV_ su"d !εݶY?S9gJ<4`J5k&!PWmf&+\U0{nh0~(b0 |bAW$d JT(,)&FKv9oSS0լ!X$ 2c"hH$-u~oZM)VqA@m-?vU@: ذZW)e*ŚS̕ %%-+;aF%"&9ٸҲ:D8 P A/TQbJ!o&qGFh)4M,l@o/`dsJ&馢ԗ|&{Z[j5͹3FCo~WZ!C3Ͳ,l:TWW=gZ%K~8&ILZ$(NÑ~o$*ZQ֬mww<5mNi:$g4UJj9|Fu>DFZ炾P 1u2Ff&S. YxpPlr҄sB- =B!sZ>suZfNPD9,-9}TqH@N٩iP*OHhYo\A~H_`7z>`ѢWTWP1 *kx+R"(cT$Rj+dxsk'.80W{uE^?,d.BLt3 Q`qrqʒv!QpttZPΖ< 99@O|D\`i_nD5FrA($+zG@K #Ϳi`Q@%;DK|uuB\`teP\R8֙cS\GssB50@6EJTjʪҶ3֭,|B1b$@ssiBy{M  8*$vREv1[$kki- >V5^ ?^,7:I= WJ/*%&F7MZoj5E$teѯ~:[2L08l_dڝ?!D RA@击R0oV;g`εXʒQHӤ3t-a%;oK~JE+Ԥ_a)?OW,[~*p  ޟzC9Hu%sPs'd>O=ז-0+5L=l:('HUSK$H%5 ݜR| aY:z:F"EQQqU0.H$@W~߾ԴWê`rT>s"]dZ';W_kkI4%^~溮ljn Aݔ& Hw=ek8I[z1: <4d1ߣy%:O ϝvJ$5K;̸,ye1jo~ajHyU#td(`酑N+PaGy{^MAt׎wthPoVXPc40D(,FGqG-vbvŊvwF ̺eU*{ V;/rTpD434Jf|{97jFop٢cw^GGO<tB`G6xQW*|J^<[6bnB!&+y .(~ŢkҮfv,V*ޘNףyK$ٵ{y9~krKw |ui䑴p-"E"sܳ5\|z{!g8k}vC}кEGXJq7:U,rnVy|3hTdWoM( ժk[](4v\^oaDn3LWӜ e6l>kH$}Du7 eY/J%?-Џ(\mL8%z챍Y``5׸flXW*/L;rNMg2{Jsfu 8E 0v@z,WyT[2 \|Ǻl'Oa(D*̌>0wZ4:`UjlYVbtnY F1q..64MUr@{y-,8  !8;X R R V 1ggsP1Jz@S@.R 6>r,ˍc&'K>= kh* ccXBpadfZ03Ds=W_+hϬZ-qԿcZjSNa~~CCC8s rvx 'N`ddӘC&A8F2D$i8aty0# ]ۣmWi+ufNNjUic&orV䮌V:)m,ӲB!e`إhk4g&i)XsfY 9w̵޻R ņYzw&0O'`>0E> h:]ױ11XϽ|~b5Erccǎ(JH&(,N={`~~\J)Xjns8J!EZ(MZ<0;KZݖ\6xV񖗁gzmzwqV:-nJ)X0r-X8{q֙3#_}_hL m6!,.."JȮW(Xz`M ̋pB)e, 4[:a6(2ua*cwI<篫;;XGB:h ֮&p#v>rc|O}[J# U{BV#NJW{R&*Xc+7+7îxbַrJ4"X3|cW'l cwN aUw(X<'ouVe Ţ ,:b4:1颗P(E`B8 }7 3[vi(ig7?҄.PDf`-dsϹf>;y\\^Q "X= EJ151ͼބe$ߧJ=Ϟe,u׵V§{_wxFJ"^~Se--qIU2 p!C)Hu\{_{hSAW*A#L׫i ȅ /O.G'L;ΓO21^Ҷ媫% څUCC`S8''Yjc++nWBDX~PnR oTH'/|ym$ 4r̟J/= y)n~l"fuf V<&+Tk_7D^ au=U% ^ŀGӎ ^{l>csCdP(my]rv޶JflӤd L /O)XӱBrRӼ߁$\HuZ{.n&: 8 +C } %lX5Wʡ"Xm!ɰދӮ t䰄! `]{mKI a˭X"XJ|n==r6P'\,ȔP lj,y֯^@K~jth3.[r>ؐ`utSAY-,1MFa[/jUa6ZYYAS4 >j_};"XLDTB4u:@w G AK %o7` DA "X ,A| AK %o7` DA "X ,A| AK %o7` DA "X ,A| AK %o7` rlgmC@IENDB`rickshaw-1.4.6/examples/screenshots/scaled.png000066400000000000000000000320371225123340100214520ustar00rootroot00000000000000PNG  IHDR,xH sBIT|d IDATxY$y;$AV$ebWR(k^3^i'MrXCZiWdD(( sLGuW]w!{{n y|YwO}'$$$ >kBBBBKBBB 96 +$$*cCBBB 96 +$$*cCBBB 96 +$$*cCBBB 96 +$$*cCBBB 96 +$$*cCBBB 96;?ܤZ8(8233yH, WXLrygڶMݻ\z 0GUUA׉}gn2ˡ1MMӞII(e;GIM4{>%"8 (b1]M_u&Qr@Q]QѰ(.U\|ߊ0'Q!p$N 3==ͭ[H&mLOO#ۑ q4Tl6K"rORS1Ud*]hXƐů}#K"2; Au;Pqn4g/蒈VXΎp{t򐐐'ǁz*T; PU-g7z"SK<7`8ڰH2 k󻞇-KNDDABBB?RX$2y{Lrp\E c=n;8PbX쥳#Y,Rl7{>;7Zyve|?ku e{r%L 'W3_i؞,nǢw}6&n]\4Įfr3W{ǝZ.ri2թ,-5B<[| y*H"*IE(6i]!ըoy*ULnF{S$Kc:];Yު3R6T'75wz?e|~(/?6Wx;9t]D&btBb(qv<ŭH29~<=~ \=;ދ Fxlo{,DD(6_ǯ|ſ-&kGpq͟xQ(zV7y칍wn>y~#[2/N?{  e{rw߿GK!ϝ2Ù UF%,wM<#-rO>}{l(r"cp0|f }=n>X*qi2" .}{D+{gdG98/$g;,oթ6-9.N)6 %f+#R5NEƻK3yW/[fr*xPi8`}kw(ߨ4>3cڷmVO,ͱtҶ|[tnsj!!O)|O7aYDRQ*Ώs'h.Q%(DβNfy(9r7JF(խ}g\v=JCTcB\c?Ti:ۋ=퇳[ ,jVm߿6Advc w˼^!_5a`lYt%$ir (٪foX>L&t?Y.pdP{.hFW)6&Ɉx[{Ý0ꆍH Rbh@o˟=FŠfTM&K_1VbnG?/} ߻s`iQiX=W|`:qWM6FS\J˼|fOA-4n] lW(ۓ@ +(DaQ3l9(i]l=Krw)HUe}9W$jp2jf|6(HTW:/19gqs؟~g|n.koj>Lw7WX/5':, 0wdm4MjvQ YZ&Xܕ,N|]m>8֣4s>l[pn< \>SiXHxzQ%46[}ŠX2ZSC4mY,cqx&DBgDRgұΛj,WXcеNiZ=X+5Ĺ>K0Ӓq,oY*OG;? 1XM(61ƅv?*SVz~"._%|`q@piqcdNi sMA퍦Efqo;F.Mf>_:35_DdceOt"+6푈DlX4Lޜ X/V6 `oX%KUg2CEAU>}ib5}CjI7,߿xXa+G>, pe8FbXtUFhfmLmAW&kV߰ίJ"+vy>E:L+)6-~㧈25t<YHiJGN'Xج>E.UBMT|Kl6qE4TLDXun-z2mg }p,@U$CDlX*O*Ժ |Wu4]FS$.Gw_ Yج0{>ޒڍC^85׉u>`*ĸ4 Gih`:.?^-A%t* aZ6#~7JKƱ N R\Wў҈v4) %K",Ro0eQ$H[1*F)#+[u|ߧi9=sQFS %tZTiddId(ٰ[+\:BRkXVl0p2gac;sU]jiˁb}7x"{X}pǏ"}n+Ҵӛ=[.߹ Qu ]QAQfT5k jsd rLi`7 8^u\({s9,fd8XZEVXjWSYޘ@kFk[K%ΏUBJD&'d.)}oȕV_r~ΕueGtM8c{KDDY-;ײL&tFNf`(q##Q}~ooiq6-MJlն_wW\ʲT Jb<uڋݨzQTLX _?5̛QrH2s*SÃ+Zzy>Ur=KM2|gameWQN6,! n39[)Q~qTg,p<^>%)6ar "OeQXII$+v1wK@\X\mRiZ:/o ':ɄJ\?=Hdk';Ass/} SCqz{R$Ә$A7|k|e~21)&iyQT}6BYܹ۷vdwUXkkkyVWW)=Addߣ2T &ZnbjGɡ8ͺ͍U^)q:c*F&#" bo%(t*K| E5.Of4-nhZ$x>( wk&3 +٨x> gmiҶGZN$t\*A,|:SFj6*MRR$2]pf,h|J|geSzrc4"[nkzy|RTXϚBd^OorDU|=='_nqbeL&E󘛛\.q]Ͻ޵ymm Q;c[[[bs=߃|g綊Qi:#1 4\zâx~y8G{qQDO?˥eEpLs\c *:n:4=߱X*T8hr ciLsۍ2Mul4MGبETX\I c?golVheY8&g o՛siֽU΍F1 c]k6;uu=Қȍr_}lg^&\a kcq21 E_/m9DXVotVQV&'sq~ճؑ ǵm˲̩cQ7:-]X/qe*C\X,wmY$tb%':De($w{0tFׯS;Iջ*T*}EQPUl6i}MӞy0tDRX61l<W DddTgfru8]d:ܩ469'X3<޹&g;v'&E&&$,E`&:3eβlɠkjcQ`t 2ܭ\vތ$ϏJ":*IƐ$Ewh_՞c$눲3R7Ny߼ί~2o}&1!L os8MGOW323`Lϵ n,UyƏY?uen,UQ|ua%tTYg?6v(u3WML+v'"W:'R=ov|gPgz8;yUyQC'{*1pwՑ$e&ڪYR$kD? KDCq7kȒx:#6QEiHEUD|P]ڐd|{xl6Mxnj 0lqѥ~EwvRY$5F%dIj̗L(YQŋxsvnDq<UP+Ɂߥmak(\<{U3K.N1J5FQ 5VWZ^y^:3̏[n󣝿7"(.&ض{KjLS'Ndo@WzXJkobGAyl 8fmNcܬѕGRP;X-6 ,-Fuqzkb,D_{&,Cćc t 's ֹwVJY-sn|m G~oK=/rb0],.`7Mu<;%1SAnr:nbDz֖ꀚ9I\o97ȗOЇ/$xo"Of>33l7 7PX1ezLo\25Ә+|Pdpҥ˂iN涋X,`@&S3Woy,t'FU JJݻ~no;-@r!(]u&ڲ ke^jpefIMl8۪s>wŒjCBFt$J7**G LO8r̙Uư]*MdZ]u8b5q8<Ǖy-wQ?usՌNo:ls|"x@0EkgI*gBT(4V;QEn ;K2By 0V4uz "_j2=WNf-تFj9UIDAT*FKFscNJ(udIv\+j=[4A+$.ݨ k8#yj>$ϧf]jb7v,3*(||"DmUZnz(`B<10JcuVj0<[{HwU7(nnˮI-bI`8FS:-++Ә]mMJx\dx&\ɮݥV[dT0\|&#IZӓމYT:vs}ً yft/Ye6pPT%+g?(Ŵ] Uh*:0^x(6wtdž:Uj0m +)7,2݋wsB3hO3ԹV!ݕI2Vk,T%n&ɨJLi ˦j1hz Ī=Xs1*3r"sn|$QUlbo3!)4^/3S!Ȩ Aݿ~OhAC?D&my~g}X 7垂ƽ ^>;Z|˔U"Q+71mwX(r E0l7ޅu8V7xwH& mD:KL=Ƕ")4,lDhجvs&8)o[oi]Q#% 9d"[tzUFN0>{Mt6(Eca;b]wWï}|j7cNLF-٬hLɴy~$ɵ:XMu2k:ur=D-OQHFu+}yx6DBgf0Ұݞ[th w)2q¶jBV!`zY6l*Me^S_>V QlX;ZBKU~8ˉ\W/L.Y] ^َYɁq=3MND&z^_rD.j쌩D3w N$tlz ",䫻 V'D4,~Dw)r`,eZԴӚغ(vE~:}2qbZWG- ݟ1lۨ}(Cݖ$@.XjC\>Ui:" t x%_foo.IqZߣ=]t$"[>&WGG:,r6dBEtUW&:Dk+b=-PCLK-K}ޞ+fw"atU^P٭ۖFr\* l\GLFxi<$ |2(Lm60<~h6 p1pţR_lBQX;$ E\j-VIJ$P$Vk7RŮBPa)>&ShZ׃$xښo]ʉ ߼wbX+A&i-6vq^v,hEm4E´]*MS8 fP|r|8;_{9²lGŞ!!G禲| QU#R%Y5Vi*?soJyuV zhͮU/_i4,\<2=xܙ' ;v(R2H\f;$#.kg.|+ 쪅}]$e!2gϞlmQ|+;4`Q(6(pTMΏ_,Uo2Ԙ[/# P EUuL鳆\%e;8OXc,.jDm Pi8A2#u {ϞbW ]k$# $2~6fLϗ8(L2SÉC%uvUs$a_~3JG,Ql?{g4c8|ߛu!֊Wuc]T)cn,oԸ5/}U?k{O(ۘƸ:/]/Z=Wd8%3=w3W_|2rNw+vTUs.xHa\<|bڽGS{V L'(L,D(U)5˥j}yCtILd\ǐD=,3&pF{d텻minAK7Uut$hicR,yTr}vm΍zGjJR^wlx hEA`yyT*خ""DQdYfmmh4ڹ㒫-,ϣi<@uTUe}};ZlhDIP$媁~es9\euux<$IeYmWVVb,,,tg:~lu]A`vvuYXX>}uE4Mc~~s >ٍna9bH$ylllP,EE&&&8{,8K44ML|,Eܪ4rLVh뺔eR1552::J\0 N8333G^(JgllӸ0 < ($qiEacciqmO}RD.㭷btt0eRDZu]&hsugee4;޲@ }bR M(JJ%A^:/^DuHRb6""j\.ްݞ2MQDQd}}1 EjmcxӧO#"|~.,,8ڲI 4P*(R]p]) r9m]\Fd=KdPfg=#N#Iccc]iR,9y$|)* FMh+a6CCCLf/b8###elf||r w}* 'Odkk1LDUU`(H$h6T*N8&Ҷt /P,;/HQrarI666t]"+&r h4T*!r^_td`bbfiO4Z%1zN^g||b4|X,8D"`{ۭ-:3=P(Hd2DQdssEQ$ z[P\IjfA:i!sڶݹу0 M_FA$yjaF}|Xd{gLz$@ ^TcEUW]{۵`]]{tC B{d9?愠kgwz5 )}]?( GG yOeD~ߌ}%EA P+ ~?o%9e;( j5s\N㥗~-Uߐ(?Hq) b"$˗q#GQTc$O'M ދӉԻ>Ari3>* uյTB;ȥ#Jee4h 4PM;E^ ~0 J>O<֭Lw#IZs6l#)cI69KjS$x02(hgMg'`gv˲jo ?wV|DkD΅(_M qmDE+0f Bw7$')%b1rɧdN|r htL\qRlD;طi?K[EBȹ6pjXhmhl;9~Ix1Z G+n"4 Zc $3~eEŅRA R?Grھ}qn7Vǫߟ*ż6z,7K)樽 Q^K(4a/]CVBxqjj 6lQ 굑7)xǪ[E`ҧR$ 勫?gdLC ]*`KdK4kؽ^o_`o#;χ$#B(B͚ɘL,8o(  KFXuu$&~=wŖ-*Oکn&Ϩ}\nZcK>t7U5MO)"^/+Ǐt)'N0z4mm̘Ap&t𗢈шłD 6 jB *&9@lfL*ltt)n7z=NAL ?OA|ρO\<@W6,QxA4,Rdσ3~4Zl!{93V ˪JKIME!8>ȓ;w҂,~ϼ2@muXMi2n!CJl61)(`%4/G3$:+IG%"C.#"QcG1)"x3X=YFG9Y 5Fќ%gqt Gx)cDE}*a>E!4 Yc(-%*gy5 L&˪A$syj 6jZJ^htg# Jѥ}IG(ld"$^ Þ>"<@l,UU<))W_UWןv#ttKHȿ5I~[<s>%" '-+tvbс(̙w$omm$$PYIL {R^N~['W6Ҳe<)s: Aslz ~7Z3^Q~7SM_ؼx~_dl6Zn$@e;hq|\=aa~lY̛1ϯ|)t1a,7_*7 Q==d.T՗cQ_^ :;8Tw夯Lf;7ߐܹ=ZV3"-&q8P~x"2=EH+BLua)M|It矖BUöU8Cvl64BBTƯu)*R3O)5I] ϣq0RGkdyMr0eʙerD Ӈٴ YPuxBBz$ 0gASԣ:.S$ dٳujilK}9R߇%tF ǀ?oO* ZJ^L KCr)>'n( /DRˑ$|>V'+g!-ٰD^{yY4y|>_W $v1`Ctʗ! <贿C44{}Xشg 6>}hkt{ EGTF <Bw7QQ,YÔ)gl_5 KeC-(YM4vFK9;)߂^D0(ϭ|z)]uDfrnjNlzq$ &'L0j6^{7!w:8 X9{O`4MIόFшu'NFr ԩ#Gt.$Dyf+p:Y#-M+p‹/ttQZ0oO<ѳi/Ck"mӈ!NaAC\FA=k K "F|F J5hIt4N'HK ?Ԡ(SY׋ۭr*%yeznYYcxV$ ekPOhcO?NrEAԨ+ _nH&c0п?r0}2m\=K{78L P]W_!xP@HLt&:E!&ךڅ%SaBGi}=Z.4b0j{_*d VS^ΉL%"<[R[KM k_Ή_Or2!!?hatBC)+ HH8|Iî2d-4D1Ir3]|-yAc%{aPVlgӓhM|HuSC{Cy -U-RaG abjym4vlH"--,㟳Gsփhkc!|sjnpɞΌ9 ~JSsj {AɐMQ/ [>g@G멩f,>wabF_$='`X+zuvFx9>FC_MC cJ$-&=?Itxp9OĺQ] P)(2H1MT e*?= Ky9۶a6HR7DGŶmttr1q"w܁@k+o$δiQZJrrN*qHWO=bRǟ) GP+cz҃1 /(Hzvʖq| }`o@tDBt'a~Dg0xN&23iiٺ <&hh`/GF !<)cm=Jd$0p3o4I7^E쑴T1‰La&uHp;z6LљhtT"J~pw5d6U ʼn46 /PQG[=ć"Q[Bg'lp| ))w/2i;&ʕD, AМV^N@D`g# 41@5/ꊠ=@l4JF]"#J( / z VBiog뉎nQnÇBhlDa77n`nt:oQLxI+)cǒgQWǜyFx)B;~ pJpm"i.c8F߃[G}hh 1z$XyY֭CA'w ̞͆h&w :3^DtQ=REmlzg9Й:Nթ2: "ȾCBQb]FQC{$ EkGr 2nv8֮eh::Zƌ!5:fhƍ#.c镃EN[b4ӯ5:ȿr2BG.]ȼ_FNcirbpBDgq;x?o[/?`aXhnF'$nx}5?e jMR))͛ob AL 42}t7cM&<5п2] -ݍCُ!yboP_ P6stI pb+Bk IŸ?/ՂRSCt4W^ px#tn7HD ^OA;E1; ՅFGHVRYx6ٻÅ,[ʭl|*$ D&:"K"P<]}'$aE~J\0jjӇs׏k/-b,bbT9 2 0l8gMaAt:/#2qUpWpS$z3S̐KɘF X'*gz ?FFl`chܝ ʝ[5d0ɮ[o!n#,~hn櫯#^h"vѿ?鴴b4%Kz12' INO.'A/j/^"&dش QD% cK0e5rx짆gǼ%QEk9x!C/'mʲ*`? e$GA xMn BC)/Aٷs߰aL\pf] (vS\NLKCI MI ~/r;NAFXBb :0ZXcF"u|?a&qxO>ѱ >Df%0̧}bU=BXYK/XEE]KYWSSELt455xLB}=DEͳ|9>CE^|+IH $=Yɓ ~H:M"ϥs> Ox8cFH }3$ ~,NXC"zԂSd"@tvҿ?<턇cֆ @u5( }p-u|-ɦM`h,%ס 7x\|K;+s4&əA| P wk na)3i:(EG5_ "ዐ?LC|\H} W.rJ Se !!JXe̘E\v–-hLĖ-_|9DDv{de1ztmk| 0dƀlߎ^OW])"}9vPxCxݯS!<>OTƌEXD&܊dP=NA@1`I;.'!LEO FV)*b`T@ ` ,))Ac~Dn""Ed@0=?zi-CVX}7Jbgv L},$} P=: .sfr<2StP}oAo"1.h$cS^FKI \po. |1z=n7}AhkS'Nd:;?gngL|ŋ9zzv<\.޾+W> \+@YCZkpcBGMZAD0GS ҧu^A0u]lZ#n;}Yq~I-+$g;ǗsB "H626&1Z4+7n!CB22@fTWdvq1]]a42f Sp?MTW+pddPVB߾q0#"0{}Pdz7ϛ/}L w'z+nrDoUX2i'apS%ٻc9Z$=ߨ'#xX,HEEdgsX#I\=g˰a,Zºu?Ǹq= TTp 8oDؿy1Qd6z Y&/I DP HJE%r6ccMx19L꾞J@c!uXbD}.bht{`Fn,LS8`$mG e}JF-p ɴ7 Sg #2S3aø*,,1425< KK~|ÇS_ϱcx*zHz:#Ib |=ded  ?N^^OL)tf~ղ^Nf\~V=DmF $#T&N!kJ4_QdCDl̈́ $'|YCe%)) .\L q XukSh 47( μy̝Kh*~AC1)YXhg`V湹tu1x07݄(t)Htr1r$II̜ɹnv;V!ttp}\y%DGCI%h];Y7bz AKtql#ߠd5+[j c!HzvǨMGq(*2*Xq2 /~`ŴWflя;>I| A`\RSD\lyD`kE!*}<_Jk( [Kƍ^\.fT3Ctr PUoc2gW#˪a2qG{׎Y~;Eˈ-=N)5= 5 Y(chMRVj5=p{SMga:|>U7Oؽl R{Y0%75on0A;v CE4hlOgdF0Mc$5Я.ܹx<\x!gXF_ϳbYY 3}:Yg1k#аV:Z;~}9|Dk >'F4#t|G3Y)yi,d5eoDғ2o`%$J dBL6/$ic=xۇ>S}K}0ii咅Lv3uRh${~wq Wt:""(*;:v@_?PL&4E ᠤDWKok륳>}J՚w apS\,v j1'kՀQ=6fDL&63!il&>|<^Lf#3FyPpa-cز #!  M:EQ~tx҈"?@]&/|9 l˗LyZdvA 1&'T>Ui#I*=f3c)zNhIUW0y2l\GO: Bph QEh9g)c "}*X7w!:xhtt̑l g@؊#g.s:gƒk:! UG'}`hjj8~.ZZPdZۘ0sa('4[ʘ1CE,+cd.^{ƍcl?* "4gLk>5 psA#Ssb ZVwjcz2XYaEMx"v.XZ**(*B.k!.}l $>aoD ؆(Q{Qd$œ$J4a dd|{1(X & a>$#/.``Zq8q<:'/VV3iia@GeH B⮻%'G ΜTNJ:<]H?OͲ[ tRBlL y9¢@Y%&I墩I)-bAH|qTJf$k^Nj͆`Vݤp%@׉vvlP0Z}"1/f6D=xH:W_x<8s樂'Xv p LVKN^[a!Z%%,)FLsRBN5sL̙[Gh(63ɂ|@(2Y ?O1JZK xi䪥,4F284]::q Eu :c(Zy/lۈ` 㚕yq( u̟Ϭh[ǽ`IHJRog2*vM~2UٶXF9Hg^23z&}۷uש g&2hh>Fw:@w {Fh2Wz+mT8 ?C5/waRsYD̰a LA…2|8A+y6WhA n9رTEQ"[;^ p&&?Eʘ3ևlǀ( Kyzf{C2P3C*OMin@yOJKeƍ㪫jXhn@idFL&rs 6?MѷSFLFӦqep,]Jr2YT00iF 0by)>̟+8W%nW`Rt$E$P[Z)^G1EPAdͥ$7hQWxBj g>PRwcLhhV㕯ٴ:pəPXȞ=(TVY=sNz6>S}Du /}Omf#spq Bkrk7l""At'WHPXV>ul>3$ LF8ٯ0hNs.zK5B#HF[9Ȅ[@&+D'BLDe8M}̘Ź7.ȱ"mGQA^eƏ'2R [bh9FS1qt^7th ٗoRݿz> cq8NزqԀgAE֮W8pIJROgڴ_@zdOf*Dݻ%% PO,};MG,5ZbRЖsd8%{0E`%|Y梋9 `1~D&i7Kͦ? y0jjǣE9TWŗ<)r':XD=SOm{nVbQ#og`BCgy ILDQ[O4g?L,QDeKأh$j PB .3<AKx,z4F&MUcfuG&hMɞ5[!m"S8 wh^Qi*Bg0  (.x9g?FgE~|tG!8Lhd!#@t4m6O>Wv3w>JzRhtupSDF\~\y%K0s&k ^'i'[>8,@T IOxi fT\O 3 EK9 Øp; y|W\EjYpdZa2m2)5l&%j<@GnRQCd}oY )Q8\4ddUqt9 85Ñ#+z1mdzpv#Z z+aޥb; &݈5Q1.}9lG܎WKι&0f:/@#af?BPQfr~Y{3$&E2{'_B!A2m\}{PL峵(^4z du\Ck A#mm%4NeѮFư+93Tphmf_A>biW) --& }o݌73Q:N82S{;D XB?ٓ wh^G4 TBp-%w~|ÈhZYsORc~g2^V"28ۍAa:3$-[p8Г=R>^xѯQ.L"~p/|.VCX.=f5P`K,#JX11n23f$QtxCH$inJz9-k'1UOh]3I#K%co!~'6s#1>]Lι) O<_SB lEq22j6Aa=>~YQ:ΙU>Ȑ&NhM&RjApٶ ,;*کer7@xu`2!I:Dz:7Lhh/?al^EIƣ_&OR+~AG t=Nګi5R&BL;nt=^'iLOdDP6Wثj +hoī#ODE@ #>/s#.Y˓ ^A&vFp[= x( ׫$ٸ+sZáxx c2^~ N`RBC9t!5B2gԽ|/FK}5{,YsЈ&4Z]IX*KHjJh"s6GQ AaD~dZc$ l#;ĢȌ#jɞCTɧi$bsAX{ND7l}y`߻xaچK^ǫf´=k~OЙTBٺTtVOrQV@C*r+5z*n%KؽSXߟ#TqR'չ:39{̛ǂDFޮb, s3%=zx 4cTFn]MfP/*}AL)?~Qqu5J}+~ .IB0ke|":B3CzAK\y!{OՊ^)T=!c&&wb9JK̛Gx8^/͔رa2t2e wȑԨKbq옊сe/OPHMt&:j0UAIdC~ g .14j'ٴNY^(CPSCĉ2鴝"3h+g+.A%qҟ`fZc E8|\s$/W{ 'QGd6}'N0 ̈::Ljn%>7Lc!Ad{#c [cKOe%ӧr0)ڍ)–R+I&֭'8j3h@ 8Sg PUht,x$Eto;]~'NBc5׏5MF_Dc\N|4>񡴛%rr.ەTwik?2`( '#4~>D`UƟK ȑ|=]]DGs""#br^${諒>";JJ$FaD.Ch$T%hKJ|xo/o9 yDQJj`b_v5DQ~v$ s!7Cpmt=9AB jM `Kt=>k,gP;Ha > [ T)UCD/&$U[iH<^|NR A7TJdNLsg>d4Fʼn:uvCl.92BOx j$1f?DYD=p[КyuT t5]FxwNdC M Ț|v8"Z&4]k䌃Әf6F}=Sl~%= >-!FG'l5leƫ<ߗ`5d!hf8[tihD}F{%|!EY|cgcNĆ 1{6DGq!!?h0>˗_r--( ee]˥vٻ\  7~J5s.e, D*`3Ha F\M iُef^z'Y17ݤƓ<ա6騊cS}_EA`xj8Gq>'1aKP_DG,]J1r'lb)+bӣ/&Z&C AG"HnBxd9˾nQ}ŗ_>|~jO'hvʾeS"~6jiTwgcjPB8 ~t&<]qۑLhl{Ϝg:19\%J@OG%hV2.{b ):E o& >Oc;f 6ί)0#r3^aU1 t-%ĈI<,Z ݌#  (^N~]g+eК@*sl>3# -`]{an>]DiKu;wߏ,Nke ^ՏH0~80_.tYv%.qhPҍl$Go!aHq,L6VD.; 5BX*r)/ Vu+}'g1!(~2g1Fj':5?&vRaB^N'Q~Pbiu~HC$VMO1l* G3If(!D#g$֮q͛پA0p GМn)ama#i4u:rsU JSUQd {6#flay1pɇبނׁ5xZ!h%bbNlt l|V :HI'#4@ҧbejoEk![=(=K22H7@t L''%eQd^@w;_Fk [+@8_n8NJY--$%ގ߇5nGg%yjX׏#GسU^ٳjTz%h|{Vwl.vLL(=m'8  A!;p9UH?m:s\f̠oޅV`$Ot4vW]LĄ q0n h/bJ@UmgCBTz/De2bECc0MDc{_&4#s'}6))r އZJ66br(ZƺG8IG}}N[ja0:Lr9*~ 6җG uuqI΢EòXLDFq\{+.و"aoBd7 U9 TE\.s0߅FƤI x>U %2R]9^nfr$.~Y3UCFx-BiGA s$-% 5`l}Gp`_GغZ5͸qL *R5t522rHu%.:!\Z01cTA )f.W|@}-FƛYp/]M4Bg^G]>cQaN*@.=(! :}'dƍBCGX[ RвDD@úgY!0vV@o"2 ׅ9 w5Tl? ~c6Ab@FDAT0Ityڌs+EoR.Oi)TT0o^D [|zwR¡ULMOjj)B)(n DqTrǭ[yuMRw>HNA$=Md&,Uh53y2^KYʕOlOc$@(\JHbs7Q^ǤI'IJR;ƎeƌtT35v uu;F{>>4FgV>R僂FFC2 6b`2mcrej-uÉm[źj vc NHNjjx/݇Č1zu0H¢q2%":3}h]t52č~Y@^Kd-ǭ~0tSIQd3X8%_π _EH+hofÇ}qH]}%bs{=矣/ Eek(#'>}zPPd"nfIb;b$Zي517rL"SjF\}p*040c(7(3 /Ӊ^OC^/V+?;:SmDш( wkְt)f3qY ۍ(bb0{b13 ~%WhZlI43!HL["oق܋,;x$\bGDT?RSIƿw:ؾLtQUEFw*e @WZ-QTݺu8AM Za6E.mXQQ5&Ǧ0~9ghhcȀs6?'0OTY63nx POjKo j܆v'`w w-"cBɽ C9 Rb:dlFY_EK4ʠAY1\~ c? l&'ի78B& kE;UFu4DEq}?Z+HMlW;0I"L1dLE(^A43`>&̑j;`lc9QH{ニ"R$?'jj1(-&QRBYꙟ&7x-BCU5ks:;ٷ>ǠǙ: S:Fy=oa3!ji)\:U|w:PdDdf{/]]ǤITTp?E)ZnYh#>NiP ~Z6V""c½t԰E:en[ы  W1l&iʠ9I,:>Ilq5&#Fk|3V$@Yx>75Ȯ0I8Ƃ~9CFD#j 8$j1ot#/N’pWPQϯ41x!ňߑ4|wN "rLG81 ~08[z99p$Y&1P+?XMt1КHDDFTc Ǔ]wGJ 7HR)_< -Q(Z,tvtlD]k֨$ `a䵤OMO3u^î$P^/]̟\|ZZll=νjN||>Ǝ'4an!P?>iMc1|!w`}ps3ɠ0UZ,fj:2AS%G N;$W ttf-GK0ӯ .0IU#5bo3~QW^AHUxc C:@9-+AY{QCw#H/s΁n6Z[~?obKēwdgSTđ#|3?%pi\pӧ*Hv 9X *իY“ PJQBs z33p ϽgqـՋ^vfK5f؈) sP^|ƾf]Ȫxh ol>&PNPqw>ɔ{PY~3g裔#444!ev6V+v; n YWǁPkiӸ~uQ(!< g+CE['Q^˺ՙ%!jf=_ΊŸ?2Nd?i\6g"Iz_1kIlh$@h0>f7cS(& P׈_K("Z}n@h2Vңx/Gۃj !ʱ22hjFEGz37GIPeh&O%5[)~V\u-Z&m$hlcTbI:EnȽ#|1m {Sc3@w3{ޤ~ Lt~ORQaZ*F3\+[T02P.4tա5t1b|u +pȗ8Ulǎُ XbN8jnfN&=̘Ib Kײ :\w߳jB]#Gu:hlF,A **5g!.Fdr2II3p yy L>~?ve?Kp"}*۞CcZ K4XRǩKs3P@~]@Oh 1ep80bPpR||P<Hl&ČS$E?`|Z+h9FDwqJ3ORFqS u: Ce\2ZZH?m&"1Q\tq|uG2DڍV|.^E 40@t*֋r%+QÑ"#+nÑ{\ c%ߣ2VQ <_ 'm"uw;F([O<G?TJ>N A!P b4f =_륫 ACՊX?'ټ"FQ*Hωn'![GTlCe % ཌ #?îPd ]@ oD =NcOuތ'HHx׮AT|>?N~>Lf49VV? PŹydO !w![YɜɱUaJLh55|>}.1X`b`& i uBX b?%тL|Y{}X,DRtﯢ_ӏIN"-t9,Z06b "*$̆'(ۄފ(1Qqd 0j2AӅ#ߪf?Ml EjIOK@~}8-e0GAg h;7 `Dɛ΅ ɛ vAAԜAT44VhmUGhءIIDǸ8Zt:FYsq G ;_Qפz1; M&m!pNa)d#u\JA q5 Dg#NmIU4:%P5t{ikc.\mnΗ A`]&:+ 6*@zι܋33m _DV1n2rt~`OqH&ASW{ah*- H($װu|Hsx\ %AqvDoE+PQûi߄A 6Iѽl ]e_ON}5"m<=5Vp;;_ZhtxrG xDx3jmL[CȜkəGͪ9x  s|Nc_#r3|yyhl^#;/cr'ب*L&<~Х.#Ž7Dc=~*hXkc!Drd4fst5cUzElɴP9Å'HB*0j3-#'X5l;S@Chbߑ0 0b)ci(r !T yD<^~A]#al.dWÿBw9-hxћhAIM7rŕ2",Yuk%)Zhp0{yE1T~SY.N" x௤dhtt70>|Dׁa3KEjGgFg p"8n1.&I{^$=;^!g1(dȠUIǎk{4)hf/ygH 1GßL=9}AU1jeuMHV1z4睇[\z'xUXzlind-}~ӑ^1 C𳯬~޷) ͥr;YsIJu(\De>BX%@H2!ɜu k11A;<*ҜtFV3W7Ua42mSPэLhD C 0J5 hGj؊!!<4ѧƥ,zۄ0(^ְ=z'YȤ9XѨC즨]PPe >!|P]NØ6PBXڱ܋\B߾w.Ӥ!KRg2.\JA:*{6_F^'h(t]0*& Aw%6\ύEjК|/31;ɁRu2lc Ҩ㭷:: ^b^WFzE7eF(RWG] ()X=A?)Eɣ1GQE@Ǩ߇?Yu h<:3DAv) K4z Ckb,= GtaBf@ШP6D6>Ė1#iU|(1=n(r0V1bS ^SQȚŹORI\`z?7 afZ-^˝wm;o*/Iᱢ,PY͊ۨK-DPRBs3}OLG7cr4GV%!8y;~d+q#{8=t`KD#(({MOR]r] }*T}Q"a( _!w;xđ$DS=jkEW=tYF41z2[>N.~8kkD7^#2RH~>N'GD}=sˑ#y'MMLc0PV"ʘLjw/= qc6d֯![X`KwJz.M(^w{׉c(V EV=ŪPlNbc{zt47<'P7+0"(wZfcbb:_SUM}/b |}vܡ8e IC(>.",VBLٟ֒^b ޤ9$ m,eXp!IN&zkUOg3jdO&Qք짭adLob=]F)2Ձ` $$`Bw#PV.og<.h M"D$]"` Ql6|>6E^~uص s:knG)-D֯'-nRaajCӯ`Q Mtv+@t=iM A $h,NW;a̎YIXHtC/`G:>F%h (xiL|q\ 9|NL&:;ۉNJ?W8sPQ,_΃q oѤFWDQao(ʿ-0r𷿩!;G!47qɜNW>5qBZBC>DQW{/o'! \.NnYf`".` 1:;LFh(gMS7Mf& b#s, Ն5cA$n ?!$RZJDY{k""s0So6ݏFD2?h*&.eVO`W^!$V7jӭW#IDF|x\ju pm؈O߾LNe%Kt4iillTT0w>E97 G5BoA{TϯQ2^.x IOg-0+04!UEG%YOm)i)B:r Pwbhoe@ ?~/ :WWCx<̜ɓOTa&jk9|uƃ5ap':ٳbo!?XŘbI|AS:'y$ S.'߯!epRHB,5NJ*deEA 01q{DMYsQKQg Vp; Y&"<91cx) N:;͚0sz=_̦M\q'*0!C!!sr݇VKFdz>i, L šNm/) [BX }H[9К[DzO |!0'I H:LBi-p4zbb"^yX~wNP\̨ь` |uMNųm\lM@] I5xdh%b8z6ofZ~;.ٺɓHtvt0zp9) !.#-cعp.nٳ4 G{gB,QXAVރ@ώɜ[Hrb -% a0V[k5 쳸\W\9p\CDXMb"!dt,_NM EgA@$zJdvd1m))pGHj!=8NGnj\h<wlنCvQM3iFV09xE᭷8VBZ [ˆQ*Yo5,κGs}%R[†mXf>$#a G0Չ'Ȃk.?c͘1~!<z=v;f0^CW9ۺWJ2L!5bZ[jCǑe|3(?AU5aa2 Eġ,HVFR0\{&CsrC? ~H/RyWU{''@ !PH 4y(D&0*JQ;^qAыƂ H!4)!ϾJ$$'<'9;k{k-w[M$/,cXB7֡55U(a\z *hkK,QOP ׳F,XVK.IHfaa2t)˗Ӳ%dd0u* j:p睢_^=C!WZ_Z-BL Ӧrv^3Ԣ+8 K('^MxD T~0b/`,,/rS/AڐX*3m/sb#~XXPf>Fw/f?æ͘LLI` (5ߑp`999t*cP<gZRW7SgyTr5Dɑf lX^N$'Ayym4h$ʔs-c>b.=V룬cLj {9ΘC`iZ2${8O'?_M`ϸlFxtFll_@J* 5؋8 M 5B́WP|9#ˌ'xjz)+6gj*1xp5,v-RR°aը*gl!2ILd10H>,4:P鵬"z3 EѪmⱆ@ ڒ؋^g@/'BxHH 7ʥ} k/TA(puy}32> $#l fӣ'?\*;$o3fbQ@ . YC@ ȋ/hkEf&,XՏm&m'mh<>)5X^pzKm\Êqh^l'dd-:N)@Y=JM-4OA&}PO]xyITIVHbd%%믋})3f }8AD,[F#m6 \^$T>އ&6>tfD݆ɟ[虄]ysQj/Y 9ƿ =ǰr?[S0c.)]gC<9&/[ʲԻ7۷";sq';-p;5 `?=ɱ~( 7d|4:|)%$3c=A2SPdpಡ3J`;A֡5Jttu5S'vO|e &yRͮGUHU1ils'3g^5?2I,2a/fKb+_Y!Fg@Ҫ׃^'\ʹ`2QRB} IWZf;KH &3@ qd]M^"Ar̠:$~Q(+(2F7n ccH8\A׍я/#Pxs?4htD.GCՍp&OO8*tOSZuo6Fo(['\AUUI?8 G>rS8ma0S%؃V`R2`Cq0Qw}Ƣ2{6[ ͤzY UǴc;7' >}ocF "%569&7~gQqA$u>.PMfZ.Ȧ m"KZbTCIr&Ndh ^닫P޽|): C kp)*.ZDq!/<ʁlFc=.]q/2/Ez]j k) m6uJ%=ueDDnYf eKmc`z"vq;-?I)'#-( %vwZ?Foj*OӵhXx</[M$T0=hْbaRʐ%%,&<́8Л)GbiQ$7a$7dbq0d!L yj@%Tצ qq8sIDATLj*.׍IP-$.V#am֙OII<Ѫ`kjXU`3fпC @FIZRġGmR79]Ydډt|B(V4ub0qHKLw#"y V^Hr2;t̫]@X7J9r Lr_]=P"_2aiAnEkHs 1zt=tF1l_¾}CX{RP@|<<"~`|TҚȁ#ckћ?Kx\䝪AOؑ\2͛9|h uCA'/V QgNJdf2`U~mPgf-O6kXNx<#1gwp˃4PlX±ULQ RRBZZ-?OϞF5e' IVW I2幢w-ж-,3oWdd0g OFǺ'(ͦC [FU!˸q ͜9$%UF&ܰ. E`2\^]jˍj"bkÖ-ɤI̘q I@ձgrt Zmyts  yTWx$QZJb"b7)(`dfμ~Y5R̍eEID*К5]A\jbRS\6HW. J>ѣ t.{gvp~7811cUe2gӱ#!!| X̍tXG;dǫc+btL)UTL6m}{Aws@QX Ϣ53s{rc6rza^7$P c8=i:Y**,&o ނ[=hѥ23P|񩮏a 'a\؋zÉf\U-7?jFDnBoa uΣon"%&kf4*n$n3n(U,[U7dJ،fl5f%lF3J،f42hd4+a3hVf4ѬhF#Y ьF(M$tEXtCommentCreated with GIMPW%tEXtdate:create2012-02-06T00:56:26-05:0077%tEXtdate:modify2012-02-06T00:56:26-05:00jIENDB`rickshaw-1.4.6/examples/screenshots/simple.png000066400000000000000000001077671225123340100215250ustar00rootroot00000000000000PNG  IHDR,9GgAMA asRGB cHRMz&u0`:pQ< pHYsod vpAg,;\IDATxu\T?ל Xl@V@@;{aqU˞þ̼gPJ)`a${?a0 [,@LL > AC 4J"p ${+脥dy )- 0)u~w[#o oC PKq\SKayBHT>{)Y]h2Si*{F.^.Kڑ5SX42 cAᡂC2.bjϵ5Ѕ'Oq!R*1aWd:^75=j׻MHG;hgĹϬrSɈF15;肑03aL

ݴw WE44iEZv{cX H2#0 CbA.0>( E%*REΗgfݔvvE)g 2ﳵdÄVkN ({_Hw:LHMCuy>B/xӺ=9GJ8󇵪LmhsIu!)ITn{}D.dO2l,2hov$͸}$0PAbH؀|V\8H8؜).-㞕EEϴy-K{?vq7ѵ9?Xq #ҽXČ cUl *C5Ba |LDG#ͥ6BNL~a8Mmx9~M#rDC/_MԣZL'Z ` o&za+lA OD7a2qyp0i W}ϘmEޙU)mڸ{pIS+#'8 0|[0 1wR8ëgiQ˧I 0S, }Mל޴#mEǻ{ 10c͖uBf >Ѕ;0PE*P e LD+\h&:O a4vnj{?=sսw92G끶K[:z(1 QXp6ׂhcx-C ^_/^3i ΐg%x|u!}_RKI3,jM4t7]72 u 3 ŠJ"|!>r=Id=c=lTmk~UzDEa V[ l4)]kQP #O*hL#g9gꨎTMHq^)y;s}$Rk#"'غ<#N`nZsB#xY0?ONmyK4{̧=1t.1p4WF72k0(M#<^/x0]NS\,L9t'^+$ЌFSB !l>05+;GS8oTC[~b\6iUQ$*>ύ]p($9'dH.sX @2'hyM8H`dRlЎ,kT#~֠//o2wnI%4N'$͸Y0?O~;֡N .[01d!! TkΝ-Dkzڤݝfu[*YXTIUd. F0Fe,Ov2-sE{h <ݨ 0iqoZ97?b7vLu/d7{m<@Wb}~9 с0 }/1tM:bXIxW.(y,g.n}rk}Jn$G^C0{&{2V<`=ŷuRͦ43=gЂ`:cV:$u \c. h-2^Vb˹1 :1?/LlOd\'D0yu^[>G5 G7y9S@OSYc9Y=X4Iﴁk)E"o1nRn!@u}#^gݎ pdqSЍkEWn|~g)hݎ/Uf~[8~㒄k4yucڅ: LȑT<aoGS UW?6&jUɧHSѼ/F^^u|dml r|viv]@t_Eњ|URZ\SLjt%4/ƜWw#\0SVMYwQɔ֜ޢTZ-US~ wh:spu$97ؠz&69:j"݉5 <1_ d=xh!|+%rEX]YOC2@}ͣǰ୑ml(P\qts;ݩtU=76xubv8Ɠl&kI H֔;lV\I (^H,K \W?n8i`^,ZwDȸ/BhDMX9#6@ %b. x|y^^cd+l_ӛXp_q3KlҒǯ ,G!T/A4.rzo}yݑJ<IJ9-{8R* g]M=jEb7;0 %PKpb[2?_v ^G[S3&SG2tCϹuݓ/<ޥ1Rwɯ-Du.\*c)ϏGHPh>a+"% XA}=ID5,AEDԎM.ط"5CTHm»;sIh, BFRru|RKt ?^{D"keNh zΑsd6b!l|JFXGW@Ơ5BI101[!a~ '9w|J:X'e5 ;eqi~1t߀E~yݟܲo˫qW}1MYt5%sH;r o-Ea 5ѵݦ[|y2Ik埯{/a)=dm/jzCCO^hEV+4yuߖ(bm0?˽$m]b{D*p/+*W}q.4AOE*q֟qS-agAX x3~=p}u40̪@~s즠7Q1wﭻ5躼)Mkc<ʐ8ܥ- vhlV?Vc3Op '>1ĉL$EG==fF8Uߖ-*ml'(ڕB=&P_)d?/+^}t1Ӟ|J͛eq[Ʈ*=0kY}^88w*"sіD`.@NB=]*B4ޡ5w),gx6^^3ywy|O]ҧV43o';IW)t&/LҜ *dgAXq_>"]"Emy$ }~`ɶYyz_*2 qsN4 ,$=\#QJ 9Xˏu0@C?ZVAR1X>-Ħ8|MưS 8.0P7*ң4b:gKrm/>*"$@&0韵E:p+P[}?58I\o{ܘv4WOdu~Sn=l_:H.;{i.=FG;&Apc1?A[x㢴By3Y=zdl}ɞj~2xE=J_j&zD*Bdavy0?oS:!HQS7e޻쓢Up}"~îBLNX.W7JOb2IWrlVCxq.pAb D ??mGc޽t[jqnjt[ј ]G^ ͱ:N'Mқɚ H)ne>AB50CM4aW̟Էw鸇`$+=Ego>6/6 EL|1b6Ӛw! ]~8LG:`@B@ꗕX |w_5*G 0ѷt!F؈8+q }H%zQ"9lĒ_Z2n A7wuEt=?ɿϽ:76>2y8:/-Hw&Aa+`#Jlݰ dn17ZRKWP{nB62VxE[OOM7uظ˱ML=hz@2d" K~-~(&uَ {`A0_m%'\4X1Ht>@%R2x{X|ckEyy7w?i{啫<\յ!Z/%꘍],‚a~W)A>Q G{8ftDx~R&ȃ!Nɝ.up/S/SpBQ/#DGX ΢є\!IiC8a+,WqôP{苩D/͵}${>ؾg;x jjhH{v! &6hCc3YM ˏWa B#mn2FNc+V :I @&^3 ^$5;vmmV(}mҦywܤQ6VGf@6b.Ég B>hyM[H98ڋ揓n!Ԑh~'=L}q^V>!a)Y֫v?6c f(i.NyIXdK3?bA0ߏ]+MA Jb h)U{hǀ2m}f\Fϝ3l4uk?t`]=[Pd.z $pBG bkE1 Bҵx? G:`1$=pa/_بuN~s$^~A|)#H6^rqXLIU, =U B1E毇!*QhNv ͜ ƨ&;")n?5ݡYw_`_FjЋ+0x9l7毃!L~DM]ږZ"_1ƈCn)$Y_^h{zgzWCQlp<|WcYM8mƑJl$ova?) MЍ !L>qafŸPmQ0[%x@꭫_{ 3ZS}N#{U7$kTdvDsԚ~Bw5a:h? X Z(D`ɗD"n7C_i\=M&]{Vˀ͛nŸW hࡂl gÂa*Nw|}pЇB+E~$/3_l~km=wAHwJ5 !7qFiD4iVеTY%*cA0\CuZt(jc4q"\B|YnfӤU= 6]nZT?V }VZ6ipm8XI8AFk18c ̏!iPRClTlH 5]SY1YJ^"e2$$7t4fq=Z2Ao"!=ќ/*.n80-0X2 &(*5=WcJc_Ǧno*` :޴: R D$מˆ0d? Ba*u cXFFqE(B\KzwFۇOZ*Lϥ.t=\ŵc^X|7ehc0`;fa%E@ApX*bA0B5!1 cN>)=][fɡ/>Ueo|(=[d5DcduI݆s[pApAoLnESO"XT(,'03 ~Dk<@c=6J9Ճߥm{UƑK' vIfKe.5Ϋ{͚|W (npq HʘFB4>q=e@_La#ש;x'*D3ŗʂaNŵICn&W@3+Z*Tqsd,;1k3jOq~m7\ ]G7S'+ `c/"HL)Z2?)R$!xǐ!(F ޣ"|PD?9oP/x^SI;fd/*X<T+:)R_hwNA;2IGNr6pp,.m ܻ9HVp5yby;a/X Y2 GDD`<0KC^ЋtR7"CysR]]}@V:]6Rd_jӣLnmO5e}&0$ځd+)&t !X=o|AXxL{RO<Z/ڂ40-.ltEZS:*}*Gʎ*AyuJC?CӶ_N}%- a;n`T%ؼUmLBNQRw,*x Qa 4D;Z_u9l9aO^+~fܶdЖ{j4UJ Ϥt-r(Cp(D &Q+p"B j֯ (@:$xtBO# qeHF4$ V#a?t53,w_/`t?]>_7ʧ0+wڼxUA:suNV oS%YYSfVz\lb.z!5=#kbR+KQsG[2v@-MIÂaH<H}BWwθ)&Ū ` x*V&2>Q0l [ HkjUc;SN@XAJdԳRYqA=7}vT5faLNy7G Cp]m 1`;Q1-PJ(F)ʿilE,vyxC;bq.g 3-ZjHOHk%thj-E b`'T{kTõ%eLUJuU4}rY:ѳlwbӲO3jN7*-sѷ#  炉nx~o}O. ;h|&IZv*0ZR@p=Q0@f#gD[ TU8Z"BXb=DR~:y ȅ Ba~l1xk3^G2H% I$c &zWWCvbXo>]z:-;7ۮ!̻\t'pD{ Ȇ>(p'VB+C rd97&wHYlGz=|b ~@2.a/=FRXd'O UE0Aeԣk#užcs.) :2 ]x/iFGB |jv#H$cUV50Obe18eHxCأ%zQ\V9M '2m7<]UOhw;WJ ooW8 83FǰFq"Pv,! [Җ #bу> i=Q*,hPVPd;{XY_cFW0(YnH͌MGTd-*;^8}aru@q~~qY[٣l6lr6GqHW[X6eu&/=Wqj&yd3P0 ,קV>~nf>40S!`z,:W 9x-B-("0NT+֞h*˧6]WV8_:BUYbNdڦD.E՜4ڪk&Ԃvʺy2(g&%U%D9*VK?r{^ :H%/m8?ԫlv~wn$&kJ:X:?`?ߵ]X sPhAp 9<4ЀB c0b 3hF't! )\Ăa?kh0a& $kuAGrh碖_fY72>|sQƧ/;r"?=vat'A_h(K:Youko}tU 0Cm.L i@FHnYX)ƩԿ3Rp ssڧ״3=Oe(w*>C-U_),kyĮPh8xYK8F NF q&Z ;=K+g/ 7 0Ŷ+Ebľf&V&u1PyC p=ZT0:C]\$KqN*f`*?r! B.oO),@тl'70L'q\B_EF%S U{5.4lWbs~]zM0N G,ȧ$A~* ԟ#Z'?Q17%/2j:ȠaG`A[7kV1zvl6p/\(_ȝ#Px7GIF5B@s硆 D*LژO廑؎pC?2Brޘp'Co` !Rx8Z80F-qLE!l=|=BDž}P*!.ٷX2PK{]UQڃ<Nڞ_7za/N3kPy[-3BұS~Wk1K6$WI2j8?%Gv#H,SUG@Ah/ y D xݡ%{#q h)m"B 6#mQ?W>`F"Mt0`+dy_֩ZʡA1Qx gl4pBznB) d! [#a* ]!|d,Pk_[i$ bF-A.EXM'q_'xHݜvZ䥦,0MYKGE[&.KM왙nGMJ[ ug z7ZYK=Sk]uQ\L'S (r\I<ڈo'C^s/D1`YFx,`B9`F #ޠG!&f| 5-FHo2 qA (o馥f@!|y8Ea# Y؂*؋͈*LJeb7E(i}mط~E/$yLDrY&645%oL 7JŲ+jzy/UnVG:d>i`mq&,X 390԰`_t66>&N,ZPh a1?~1* (@x@mkZMkLDd(f $7U 5GQOv.&J!;#W6=t6P>.vjrRvmnU\dbhN\-GT b MD6eRNMEv:JqHNU 9}{ υJM{yHkG"F q"~~Zc+=k60&L&ԨfbZ; ~#6}grIx,0A8qrGLzTNX<v9o/)%>ak{U˜F_wjnwuBg<` Pɼ,! Ѡ31!GQ\cki$&##tD1$vp-sW8LoF:fR ݉5zzyl52PЩ횞+o6;hkt 7QW ='Т3_e_RJ4zk_A7bzFnQG*ӍY.[4GEy͛?;c vjN[+y:Q[Z~h&R;6Ь5-F%TMTSh*>߃TK5/?"鼃f *N=ÿ}t7M4ۢbOcz& k{ʬWJh6OԞޡ4o7Xy6@} [#]{4n5qdޠ/KyaThõ̩a#CJ'ŮnfK^\jf,/r`᎙/C`#?K!SfVE:!JI zpxc:V>Pp9M.s؅'%2z/8ft}=. ;~ͱ~7h/5H"0h-j$.8! !O3bf@_snpQ6Åza1{mR9hXLjT0hNdžr\2+kHeG}Lc!Pa~r,n>|DNE.`4\0YOk|#րOJk{|&~T/?H[l)Vĝ*y# Q(m7T:St'^8gB ?IB~IF}17 P ;P؅|:]sWAC_96vDi? P"n.~6hPLx,"P'qt уFx %x(B`*Aѕ=EN0EOEMHS)ǩmΎM| aHrLIz|ٯHgn/љD8]fIQ̟ BQqWE b!ǸfGT).0yadFiyID+-GUXwo&c+A݇mt1v!&JX0k*bWhKp I q8IYdd;j|xx꠽G}zB97R2S^U/LpPD2hQ}6,Fŏ(k'LP1;/5=#wR>iXͿWT(UFCf6&"ﱎuSYh5x ˎqBn|8Iw8/Q8A HMP٠K̙Ws <&7ә=Xt?fVT !AH#́'za.łoC18q8ÿFw(*6p+DC4UhG=[~iKSoFe YfqdcsipwVTC7 2h| i8Lga hE . G1 F6#{Rކf>mC=蚣^"{ Wޠ "Аߊ- 6P1d4‚OTЂ<"<.b0An][:8S.IJzmq2`&ZqF62jACOoro+BUHQVЃ k1tK-E@0Ipr!^Z󺠡K|󀛃ى9n13[k=(WF˧%I;rI$JE !~_ B_XxF q*|'2t z 7LB̸*rE]ro>lۧflzSvO6™2DEO3ADv7L`mZwG 5kk">Α+ŹaEO^Z ׅ>AHWU;9ۡhru d0NjDNĴ|ė03̷*~d Y|T՚# '6苯3EOo> lJ^%YVeu^k;jOj5sxܣNO q8F$J0X&e*knQ^GA-_ {^SM~OY65xpWEU5ҳ58D%B(G@ 9L7X2+(EDqXF;^m9c`"\0D6,/AOn0[;.ǼDZZGWn0q=Um9n"_ќdXN~S06FF *2q O-CQ RB?DCNEeL*e] ys%tng~~=3h`lBuwr6^W U6)뛁MTvIl[Rb!_i Jn}0Bqb!Dt2V.B c鉏H| ӗJ;.nbyElaUwGو=b]aA_17AwRbiPΑn";?fns/ vR:\EſSh{ZZۿ5EX*}ՏXٲUNCk~eSO_}uNki]zV* 4>+# MW*1gx&U :~;hsHJRc czncfW`{u.Ȩ}DU7)K:MmIk4Rjf~,EVxBRq7 Rd@t݂(t%Fa--j#-oN_gw*/UޭҾ;6F,F- SJE'xFbZ|F dY}J 5D Ah5D.cN7u렒M0HxOΘA {vR~o-n 1040#\ XEySk壉/I"A"RGPCeN"@3Akwd+'>cEM? 9IX*خh,9;&dQd'uP:\6o+I97֝h--6[m{k ^ \@ЃT^|g.!5KxF3ЖqiУ'SZ-y8reRx|k"P>1Fٔ29]enAˣx)@GBl!r(E$믅Tl |Xz)+Ȥ'p$j*v9Qp¤x0CRRԵe~I} ޫo-IQR^k*gډ3qOdQ3vxZpw1׺znX9fSu::u0X`<@*>؋$lgqA/>9e$aZl*Td$ޡ/ZNO樷Ѯj^rEjÃ/+^n6łl1ul@c$6@Z 45#m +aݧR T hp4ƸM !TJkԝFÜ5 %7b)*i|gl5?zE+%?MTV)m:R$u\^vQUtƭ8fmRcy탮 :{V6yuJ6K{a`/Xh P z4ϩ?*> c#ANa*a L!9a$*ɺ'##B5\a(NR'W|n-ꄦO1-"Fe$LZSfq34Bd4T }s`<c*c7]̟O\۩P"P d%1NG:3𑎣ct=Wu9(0DUXǸ}]Rnk\77k.5#[Q~D2Q )D0= |o![qtn/d+q@0A=6EUۆxס7 1\Mkbof2e߀$㠥cqMܟ<ɜ"M X\@a)CBhL';34.+~ !>0':B|iC7/K,A #4wApˆ1e}^_6=I(lUTT*iǔ); ַ|'i=[`W:k]{1rkQHCMwH5% Ċe/ߴ2!" ҆(;D(%/(AQ/8TzIA-#4ࡁaR|PUٟ߮xZpS})xQB?YSMf)VVI&|]/+8NYIKG|%@> Y8xdN;F&~$qcG ݍsQV*Yc4 Bhkt'Z!b+ H*CDB"C;G,Џ|q10wV!2 վ`$n>)>}nițR}(\bQբaCou'N: 9 Qz w/5İa?ߤ1x6R: oi)|i-GqF8$h(C+n|7P%?B=6oXd4jJrQɴ0EZjh&m{ӮUή$3rmUreR@ԩš}77akG{}ULzV=  nC)(Az/ƒh34{w}fܲ;OhzJІЦ,-'5hcoaTt;c-ӳ R(H  Qoj0B-'X /eKU L([6D`M<Л+^[D(ګnDXUˊ bԢ`|rRUĥ6qO'Xƭ1/S?ޟJjj_b_؜̷6~qM5xϭA}n l=[ubUΏ "7LAAA@@+Q'"r Gn![TABB)  0̟_^E.BjKHpRI ԃ1e%*337hR)Ok>k}a> it}Ai';=]tvsm5n:Id QV.@E) Gh]+ɭJȹXZm/h<%G^7zU´ENJr=TUn̲!~eYlEKXsc7Nύ2I%E?-qJ6u0`COW|xNkK4 0AI!@+Z,VV,l8‘ %fW]9Wrmy~oG4Y\S*Zݭg5JY@6*b|s]@NRqQ(kE >BH<@.bؑh@,#ႉ0fa@g >Cv!nR%a[j kh8( ϖAmev]@[̶Eոo_zYQ9Uu)v!S`a(Amt9WDZzaoP4B='ve%uʳ}^iOi*\= zl3WY  " /O,1TF>4ȃ9(? A !L`rM7r^I$mI!B;G4GF{= X>xc揦XN{ix; -CH.hc''jozs9Ʋ,ߋ\Tq:N,o{ڱo@6"ϧJFrg8tA?c(?u:-ո}X̅/0{@?bD9pQ|LM}"Ebc7 yE.. hCnc'V K1Txb8טRh3"1 k9/hAna%@M|ם~!}1)ʶiM䟛5]K2L=B;Fe:BW{L!0̟Qd!6oLg='1@H)fd(gyTwҋq׋,^&; ,vꌕQ:IDl`o1Xį:~4Ѡ+1%}1@<4sЂ.y% -L.0⒌Ms;Zf4N6ʹ.i߷;tc##pj$"C'=]t<]wIAKrIx!kc[^ /9g|F.h!- e($$?Fb$˻4Et hgڟPZXZY#o*oqTW׎//h33cǖ髚kof"1""z4vv&UM?5_HiצGÏB輑( Sצ$ -%؅tC;A3 ^0?aFhtDG8Wds ۵h4y/!-! Kp޸pV&.ʠPaC1&'%'qCCISwYz1>b錪ֶo4G$Ҡ@ J U!EMd6*va 1"n C -(!"֡up whk7p hyHĈaBX>sG.TTY} vR4Zl[Awnznllj{E}˲˪ %sJyEcEcmLч*_Z@ L%| |}052`:A==M 2HZjYѰaʍ[KjrNS5k2WF'c,Zrs/s/= ֶmp%؏h,d 67ݰHF)ʇ Hēx$`c>|Y42U4WE*GR rģ-<eG)6]LWw#r Q\rC#}H^sq:~?7fX" GU!E pjjgBrA,!P ` !Lt!cB R@1Oi' wh3 Wi)-\g&qE(3 eP8ƪ*v=UhSh?u}ԡ[%+HS*j31C&~`ƾA'eV$Y'VV]oݵ332\\ͅ͹C!9/%E>qi7 p;CdƉnRPGG-A~>!^ gl"%WDhx#^;wڎ:TV5r=zZ:W r4mme(W>t5)AkdgΙc2Ґ׍w&Bߧ bhP23R#m8HHnqB97?g/lB!|PVխ۷ֶFV=v>c/mtsQ K C!ض83C0GwK4DCؒd9b :9l)TygȂ`SVV)wAa- [TҟϤKW:)fzM̓'de;vZK#"3?3?|\""BUU|_v L& (q1#P;<<2=P_\]:'iJӒ)SޜYȪJ-mHMN zXi\))ѨB Jr H $ 2 D<.|D;#Y@  g7Tt]7>Y7Lޙ+׍Gf## +ƤN||NN;g_.:^+fsiЏe&<0mܪWڇM-mҡeC`&o' BP1a){;uuC``C -CUy amݨ^=ԃUP: a6eWXһKwiG~+ ׈{9DB |-d&hZmd- ݂-tidY2v]-zuXH,&#' hI҅xI d$|Ww`Cp<dtDG8kkӖIIɲII%SsSsK%&dB*`K=zuBX!a;#+_urʻu8FF 4VV;wNq'_梹"Mz ##g U*[U2էi/0CTQybpԁ: ?SL4'ͱAOytmP ^@6  EPzN Ÿ?~}W oyD$#xWlE0@ 9ȁBWͨ;wPyys51.cϗ/Ӷm+ME^Y~5oX_8׸@<ըQkQUKz׼%Ӊg.sIj+i*i*h؎h 2(a c|0;. H52HI@l4dmq'4fa3HǑd)sǸcDRB}C38XGx]ծؔؔэN¯wr(|Ji),,.V_b`Nͳ5ZlzeVìI*3x'Yޑ8=%\E-҅t Z% ah ;d ŸGҒ،HZH Dm-N>Ö;ŝlf'{ڰiٻĩ9SS*jf,{T5mIڒ>9s+SS!ƛm 4ia{{88qO _u3&7x|TG_>~uxDM\zTa k ЈL!SPP5a;x$#2tFgܦmh;C%c8o1rQ `YjRjK_R~)%/%4%V+,Z/V&%//*In11ШC]y3uvx^ \v9 _X6&Bi1v}t&:ڑ2Rh[>ղ2 Uׁ,jZށ9Cڍvw9·%$aE.ݘp!N//ūUߓ=LpAkk]>kM֚2_ސ7hh4S {,\\t8qa . $v;L!H@*~P'@@ %Z2 [Mmrt?.`1a QAg4ѕ Jr^%rzJq%\  ^Ї pRQEQEDSQ uz?ܲ/ (Yx򡸕`>ŐO-7Jjx 57X:Nrd!Jp9u04p~81'ddLGk3btXt#mq_G#F2PFzpC.at D5r:($Dy'j~UŖԸ8,,KNdk$))+Se[[[[ߛƚ vMM.KD^WzmrA="$zVZj,k R`B>AjA-Q:+dM8xDO;=,#,L/#ߣ ?K"'G.U*`U0gn~cE9ukh~iۖ-L/0)2)gqv ȇf0+H{\Tu?ϙan0\.mࢦZm*ZjQVymj&ijHiJM7o( E`r9a۾~۶Λk^ky><b/ʄTwqA9ͦH}0 @@-y=]X6͸(DAG_#11 WqHD"* 0asee''\9x`k\5kiB2B2;gdZP"%b6jQ 0BæHr=z{~S]W.]|hCцe.U.w?R=.' Xw|||w\dzZM,r?yy1mAD!N0a&f"QȒe rL`P> '3)Lk".D?ds`1'X9fxpnt{DO>Dܠp)\ܟ;gy,/u SG#A QP.: :XVSTN,;jlv\tS1_k4z!Oc_Xj|;voo}\]n[us͝^W9'&V+U-T-t:2~t 22Hy$7h,gUFe/vZLA}1?:{q-G>뙂tÙ%DG<m-HƯ+eh _KE)PH ѯg zR.>Tvq-$A~ !Aanu $V,@nl5 8i3͢YX#HXtp;ƶm7ZTsOV؂-,&&9#`iN]Ն >Ou,6W{lgg::]I$gI$\M&2a]ϻea~_ ~E xSYQQ뺾zEAvy^P7UA i]͚fEiy-eIuQ6HEH>>&[XXf`|DET ePޝrZܼ]A瑪|4P!BP~ .xQc0Q(-_^HD|NBMA*5!,KG>*Xoa[^%0;\W0 99^9rwTN55ՎJyܶfhPjhP[oo½^߆Ȣ"MR_`}*ZVMpgP^ E;Ʈa%32#P>AZJK_ JHHt) YeLE*Rq}a4caLP&D DrY˼l'ACCKbeR2YS{yJԠvE"_ǹPw ØNĚ~+rki;] XstPf֌U6 .ܲly<``?\\WqnbqS{))UU!$m؆tT 6#~;WvD-B:^G_:H E'$$$~(pPV^e7b#98v4OD.nb~8W\F)Bzz.FFKi{{?뎯JGc&fssEв;,,ȢeєNYE3יo:U{lEf9=n,n|o;7''4b*QVrr?w;\Y4[sw[--8;Ϊ1lldV[8 р8i1-|Vx@S|F:KgkL1hVC {|%"_b؋ah({] Fp\6cԥRy]>>\tt.T}$܄v n! Q؏RAϪY5DAP[%!  5\=zQO=1Mnwl+Z>} eh|OLEQZ}>Q͚u ̧ͧ ' '؏F RG{855 ",8j61S܌x՛MfNNRp-C٫[utL,XF zb9ZcNepe}^e~emfEiE=..yOIךښ:t c9fhP!ӳg^9Ts%yyT v";N4(fÇ( x/cZiNBBE(BhrJ\E4P*>cᶨƃ8*g}xGw.a1`_TNX+I-jaFz^7[͒XE`lʦ 4W~-\9;g3-Ji:v-t}{4*c/4^8:"tq;. D 3$\P/.20C'&}@hm)4a qNd[{w[X8>**jk(),)lmZpb嬜zXM&..&Dm6!:7h$$+(*rr{ըMbl Y+bS2%d%+#|42­Rď ȿA3ĩ7{R2NaF(?l,8ӨAmcps1})[l6qp" i=#{؈H7C!W bKR\@rPNIxwMYm虞1iSӦYS5O[[ηUU>/q[nF݌jfZ3ݣ5wk06V‚|K4hu][LHC|G.dW[Y+6$ hF3I:ĢJR -K: @!,ҒZhÎiB#X%+96)qT_| to֛}ȥsyȃ3bkq=]t.Cd"GY vVU =Zw *LdUYD۶sԷnĚXWL$((c~jbb7TTPaPϣTJ9C= dxfTHA4r0 a".%$$$$w%du8e JC,ͦATJ@=SS=#o}nk[woy$$Ǚ&IV}ZN;]rͽ̽**^Z3 a(@:Xy5f7a͠fLM2ЎJHHHH.Ph8j͵fOj>qWmjw_)bsVMh˩SǞWg669:DHHuN9;^Q( rH^Ar1^gb@8FR)bV`NI"!!!!Cȧipު?HPQiwؽGѼvyyLH]nD߈~}|/Zt-Fax^A07P>ChAKsq`0?]'!!!!=s!Ⳙm$ԃ+WXXcWu(w[$?-?9\ěMe J0PwNS+I!s1OtҬz1-b;c?6PZA+0FoQr!씷,̂l6a:L#`8(Foļ:-E?)4Õ(F3?>?JHHHHH)ݖސ@KHHHH JHHHH =+"zTXtCommentxs.JM,IMQ(,Pp 7}IENDB`rickshaw-1.4.6/examples/screenshots/start.png000066400000000000000000000317311225123340100213540ustar00rootroot00000000000000PNG  IHDR,WgAMA asRGB cHRMz&u0`:pQ< pHYsod vpAg,2IDATxw\KPE bK5hXb,%Dc%k5&6P{ t,l9?voM5xcCs9眃BI‹~BȋD!$b/?2WL)D .#?@*(\:  xa@]DcT"sBMct%U>Wqʇq-fJ*p|3$P@8(~g:[Xw }՟JB1—  qD* 5{0P(@UܮdS1Ĝ)72-(LZ3FyMg5S:;*?bvC ":b!q3u-zDј8&H'^ 3ُl"AøX GΟbΫYO??5{]q#bUPTHd4>TۦRK{w kwF}Ts4UUuy Tuf05oi./! oBOEB^; eU  Rü),0oq:)m]<2Mqu=kRľ2Kc}. ~L |9B L;̿ /Ro/C<w+ܹ}2Na/Bm^p}hCނHyPNl_e%B?ި9lCmjvśl Ϗ>8{aѧH{BoZFIl#x8r >[~W1 /l sgg1M8SrsGJ }5=8k{d6jӮiG[<3V+ ;`1se &bbz~t(WyD~0cև0rM84\+ ;8VֳwLR7i|>[_NWFîru5"poq/>fJ(,2 5T}VȾW q&)Dv-nX6P}G3]z7pҳڞ7Z⵺.-˗ȇ:a+bY$kr?8%b(U_Ja tq;>C)6v5Qi͝5r""%6'QZT.5mԉai#u y6Tj/+)b֗%/B {yUu]~=9av:tfʛ\JE?Kg+Ae2bʋ!?BgY1^D[y/#B362=.CϥZ&duEL̎ C L^Z6b𫤒Ky> PB `)%*(!"y(aY[&z qi3u+D[7+`UU>Gm_!ld <F!Oyb^Yv㴋 y44}7g>qXvXtmz8T|W|\{%_|G%б; e7 2|nܣYO.꯯ W NFIu(;ql"Jߧ !A!櫡i܈g** !˗T6v*Ww<-FOQSaXi? >{b ka^#wa~ԇ\Q=L/ W(AqHCg.77u3j7qfz5>f(  uX4G-TƐJ$4(O+X}|_ B%= /nlz(r~Jӱi٭bSo-s1H%*ΊÅPI[h8: оOTP@@ 0 #VH_z٘ǥcahw[op`_]9T$;wLɖ NlG#TC%dv:%B5~D 8ޒg WT4WsX'aB.zaNJ.31S**!Ց=_y+\3[y,o rP ;jCOqS[O1y{tr -7 pj#e ~A|OvB-vbh{S/{uhwn:_U&FB/6VLV\=Tu/'3$pLBwN씡Ki)YvsLtM&hTC"\& bjz߷&B:LK!y܀QXC&vIZٓK.oRK{bpV)&DX^ߟ_'^3,]bOq"j)+-2{ny}e~yW}y0׳Ƴ%PRQPC"^rk8`݂L!X+/ 3"4g"!]T$%gT.)J+mo{PB(DOzRvo Օ{H{\evyܧRV<6]*'j(鎉B̐p'bG^̩݅mv] )ץN (Q}8!6Q\F,ogi/3g~\nSw)Ll;ݓ'FvYW*?Œ/z L !ӫ[@#1{- LD>h\Ts&|^z[tBK1N1^5 J8{PiĬP%l!]rB;DӪ_:,aS/?#}=6Y.'<'r-KS' w(ĚښziwpcuXZg}Wyp7 o+-ha*?²N) 0a3&z`)~o( Ɵ8QzU Z۩r_Z{PANUBɫB#̐P ֥(+m2/{ǵpser^2.I~]z1 ?bi󅱌,YV4#wwы^;$2eH}Q@؛?7P%T`1 p1 A$5Bu0Œ @oqlp1N߾MpW3.k/la{ D{4`:cl0R^R>hjClv )A*l濴R}o6UҤpTUx6&/k-g!p#PPJ(r>|;&#a/E07q\Yū}a[:e[Gt>UaY\ "PBM{9mWj1ߩ7ӊ ͸0!TTCE8:* j(hY !yBxŷ8H tE s^NuzNӤyoP*F#~qD1]2 n 32.uJ]֭ݥ7 $cz"^B^^/.fTcV `5r ʁ-GGߋK.YoAڲc 12QD |mY,fAPMaBbxɍzZnL`WkXY؅Ht@]/ B?Da)*hœ{A'tʨ{눁,s,b!+f+Yfߑ:t lA~&9Sco0q ?Zg&`/b : aF{~o۵ُdn9LSEpy=,Gx>EпD%/P( BOa@Wsgs^m oA6>)F/c7gwlC F#l$+Z\6Ƹ;Bbs-+k*s$oGp52k(~n@4R+ Z(Փ `,~_Њk|PA WD0bjVغ!; CX~D#w Ql59eU k_EWK HUmB`XŇodF(+wJ#5lJGwRRVY5+\cծywގj{^a7+~oqr[~]B67 MP6#<k'IgД D3EI?<2W?)O:3גڭS.cw| TPZw_F(P+oeن@nꡰE6ӬQMXy,$,.@ ŋ>$B믆G3||).7X;u!~Hm~k&f|n-v+X2Nr@< 4P'y,kMP K;"ޡxMS} Y3,y,q;,9B +iB^Sn;>\D Q .(dxT-I~?%IxAYrS 6xkp9(aO $ϑe1졔Gy >fܒ5g&k| /n+Tk=WhsJʏ#S3 lX#c#wˇyKVBc6DWΜ{9ɳ}%p};cV*&ʍ>g񱨌 pu-)!'{!`D'# w͏MSfP7ѧ.55WY]x4z |sz4uO?%nr狎+k/`~^QҾ[g:V8at@ގcd_~ʝx1Q =* vָO]6 fa4l/'6jnj9iSB:z{ۻ:"yxXƔպu y=+嗒,}-a,gn=6;N~ʎ39wjdѾ:Q gT.E QzA!/'ȅq kRiNZϭYoHφ }|=*9) b+8kVʿq$*h[Q\Y[47۩)ᅲ$zꔂW3by_N,< ޘ=FA1t0$?2ek ~I'պ"iAo_kNwGTD.p=Ŀ -vxV*0-gL5.i7%_%ez#8S}ީ[+y?tFTFEt ,8;xt݂}bKNg9RvةeZ 1-s:SJK|_Y YW"2v7%X7`N}-߭oXIZI9lz_C%0j'yYN e hg—$wٱ j)'pyk侼5/#P VS !/g#iusjݱJ=Օ?|$B@!$䯰\&Qp#Qƿbo5O$Y"k`o]s}!7 5,$Vh/_b(U1c-xo.|&{aebcfӞK]\0K7."ݲ<0qg&#(<$\ WwE_#| c.WR{^z8ɚaod4cZ8 d̔DBfBB7yDghDlE6m {fUi\V4Ȗ;ѓ>rG2&LB.\>et&)w(wNdzkH h/fPl zƏO>Vɝ6gG|Ϻ\2+ܚ]b? OPpGeC#!r$d[bڲh, /."g?h'ooJ.(xXda;0M}y,gJ vPAD+AeZ1l|.te9:&#[ jf_T&E=[p@ʰCz7 Kb~B a@"۔換zf>s_>KuP[U ෹z{N̈́4."8ba~DW8J"!Q yXBeki|w!(U;=e'[uFD<i577=+D"<]=PL]'CEQ$rLA 8|[şD%„f܌NZ;ǖ>9b0v3{1>KOD;,&ߋ(D!$advPZ&<27h͛ 0N{XBtF'݋<{TȂa5r߈~ ȺCS,L*$!Z7bNWZ*|2tUy;9t~Âyol/T%'V^G LE%=ގ,-g ~|чJߋBHȫrgPW8@ˈC"Dxb-:h %'lsg #*Ed^ {b:hSmzfzu tbgRZ;o;-s6*tNn(^,T0qCj)q:U CUz>޽VU:tIAUp鬷w1 aT;9;,Wח6lHC oc5ZW t0&G!OSAqReٞq 2(^sӇ9n۵DZ6|;}Pjy6^Nbo¦K:_xÄl$b6zC;6䅢B3 P`BHj+r ɡ'1,fܴMSMF1鱚<>hyo9S*2^? ̈́,C AEP !%Lqnuf(a&e(|K8vƞz=nwХ~*-׾Pyz8qw|p4 Q?BH3, m5 r'(jGnVIa[|c_hO969Z9vɎMSFD=iܜog2!eK w8B FQ$ !!䯲D2iYnͣx_4A)*>TUKƘ\8({csFƧ?#v_Vffw}+rUin$_yFj, ^%<fp " EV b:yG45J;Y(Y Pe3̴nTy(F[#׸ޜ+|L? hդY#CkmYڥpip9kˢbCCTGEZn \W:qw<Gp 'm$c."YBd€20McCrf)kn\o_={EIdn\RD/BHgY[.8H&ބ/a) h*9)z^ViwR}%woܽzT؅Ё#vCtFoiԿ[7RbHB."J ۇH̷1 l . ڷ#MKtm^7I^?<#Z'KV~>+lPX ?;a~aB^_"0D!  T8 k2`L,s6?8J3#=wij7Qݥ[iGUGcJ!A3?>rQ=j֟ ,Сa/#GI} %tӘ}VtqdNݢVOKufi }̉ai4_~( 7PYHZ) 75H\:Fe;U9e |. m BB˧0a3BmFd}.?*WthǤ9Js*Hy^:ǻe>*7+A4`&6u]`&ȖB +6n"9Bq4[+`q t*Z$Y>27b V9 (_eVdouJ.>R}Ǹ~Ûe9Tgtٮߢ5 NaP['bBgؽs Y.i9êk,Ä\PB~ &HLf7p+MnҔ1yUKRzզ溕Շew.\M6tLI; 6$r8{幼+_b2B>܅gp ވe\ 苑lNfR|)9S(Dup7!8 0؂Mu83<%8]pFBBȫƲ\"ZX%,ajlF7=&`-Lj=Oɉ;ly&-jR+=nw-ɩ;jk?$%`V%J؄JGe8P2*@hY血F!Y 1jJaD rp?ᇊ֋,7[,WD\,VmN{:,@;&Y}ESԃДEa13s; oLF,!!1CP 3e[.P !2D_HLoxL멵x%ԪSk{|Y0*F #˒L]9{(^>[y-3\wӧV'ZRҊMA8aen(MLpjх2Ww&^lWU n r苡C.2 , ] tU~/ wёmaE_^ N#>L^@{pdB^/CG!EУ2{ebs Ӓ]NV[GzЭjf~-b|< .]sW{8RhŽ.Ec!AmTA^?74m,[3yS(}+a)ۼ^.baҢv] 0zrrTN˒XC*uk1$~uNH [F`;~l8ˢJ q S%w琀o`Lp⧸#oD,rB⑁bh1F(ח%KU-E4n|ngΡKEgWNҪ+ce)DVKSMͳ뜛=ETWd.V8z|" vPA,a#ox%is+YL\-h &{)3-!@ ASdm.hV:`v!P^qB,b'||~ a+bZ 1cv]xJۍ0YMq980}DdȨDD Thurmޖ/C.0A`<#?I͹WbK,#E˯^?|aY ?QSD-ޫ[ѵ lkx%se&2LQ,rcA0ŒP@ⅎXAHgAW)63Z)k=Lh,c7Y}v_(?O D z~ y_d<`:n"%dFQ#=__C!$6S "9xc"F"%5*OFc AKE_8gYe*p|N0<X0, @'t~N^+Mpn !E>P M,aܷ>*ҵBŲPsW>CyCxh؋`$j%We$Xo>ez@BiBB!6BH!ĦQ !4 !!F!$b(BlBMBiBB!6BH!ĦQ !4 !!F!$b(BlBMBiBB!6BH!ĦQ !4 !!F!$b(BlBMBiBB!6BH!ĦQ !4 !!F!$b(BlBMBiBB!6BH!ĦQ !4 !!F!$b(BlBMBiBB!6BH!ĦQ !4 !!F!$b(BlBMBiBB!6BH!ĦQ !4 !!F!$b(BlBMBiBB!6BH!ĦQ !4 !!F!$b(BlBMBiBB!6BH!ĦQ !4 !!F!$b(BlBMBiBB!6BH!ĦQ !4 !!F!$b(BlBMBiBB!6BH!ĦQ !4 !!F!$b(BlBMBiBB!6BH!ĦQ !4 !!F!$b(BlBMBiBB!6BH!ĦQ !4 !!F!$b(BlBMBiBB!6BH!ĦQ !4 !!F!$b(BlBMS<1{83pZ(? ~/By6e`PQ Zl?L⩺ R%CfaA]c,<]K/0 !gS~-ZDW͜*U#1Su+q9O=HGGj 7J=SELr{ͷ$B鰗g]}=tR(~S_B!6YS2dpHqhoQި0M!sBKV !4|BMBiįkeMaX"zTXtCommentxs.JM,IMQ(,Pp 7}IENDB`rickshaw-1.4.6/examples/screenshots/status.png000066400000000000000000001372371225123340100215520ustar00rootroot00000000000000PNG  IHDR,gAMA asRGB cHRMz&u0`:pQ< pHYsod vpAg,zSsIDATxuxɶ}WUcq'  >0; XwW}̞c~g}̏"___?8pXed NA&eh6&0ȟWM w+__P(dHРC ?@LF^#WDhuXuHB@Ycbz''Uhn+^ J-w^3B"?:߄PmD$$zzw___嵨kOʣ ^XfDx\p[K$fN=xc}|xPMOBt@tQQpppPP6 (`&%( +aD2!dʑ> ] kMkɨNa\$> ԉrlUӐoeo_p# .ģu\@ q8'Bnqv4H 8` m߀ _}/#@E y8@0<||AzvC߿c޷;߇ N(8G p#iCR MIG\rbn; ߻/;c4'jƋ##Q@ $A *fnrCE(nFyI6ߵ1dCC hH=Bq!& X y"Ѓ1] >:fmFOVG9Ҋ  \,3 DD z'Iu<P_HXO "驯rG617j^=DCG:#%τ#:(|!XBq=;" ¨.ew]eOώB^E#$$j=[}sT?9_(O  x yaGt((3N G ʿ% >"x"$0N Enp2@62Ӌ3>fb^/%t0.)mv*(< r '>"G/wN'Gn9PV)K-9hLvAYP"M?t4s&5%,SjvL.F !֠2J4¿grKAT"VRBVaEc0"P*U2¾hdh1~G{⍶H8U4vb^MT!YLEvqsq].T&߭9ȃMH2 ?YI>'wϟS6Xqv$c >@ޘ06<[OP|B <>c-fBBqhBb8 qކX?JWȃ( 3qPtC#*.F):Wr<m/z yM}ēHue(qbAvQjG ;$dR Q\og"OQyRBLJ4 %Eח+[عWd7_x <鎺Fx*5&HK%4nQ=u$92 Gp`p?;N!kQƊ|bO4"m%\M 9Gd.u ݙ/ MY$)DءGdؓ/MPp |OhxC^׸a&yC[7!83 چ_ _EъVCd6An0;_BL5( 6׆Ʊ] mX9 팧$%sAKh(V4I8yۗ^[F2*_Қ6=&'%F *p|;uDpCB(m`U^;3F~`ձS,0 =lB 4 `Oچ pKc+:oL<@aC8,$40  Ɵ1 QGKunKuS9eDaR(~VSrʔ6Va7iD w i?oR 3fSzR_ot[D8t^Y}!N?{B# @kǯS|P1#Dk"_Bv6d餉I22\D´F l5 cXi a͑d6HkLY|,^#qLuha‹E)xHy&8*#c-%=)8y%gO+c*(RΦ.d5620$x)RP0 nGKpA@?!JX&T n<d3r]Y$I(I#cCXg@ M(XBDwI!mu]D:)/m@t |$kRi{~7lŅo-\8Q*;N!:>LDh2y2g#Y(Ϟ>izQi}0M$TT~F+]w'$.)NF'as&6[ 'G9O<GqF~뮒XN(AXwR4L/-BX1sk6&Z#|Dg"=bneH,-˓/4qFx(au?Dn홸)"<@'8+P|-xKv /!hUPd7 ~yd0Oa4%]g#G&fW,1VUxR|Oϑj$axb~'-ט~ d={$ }sxfѕu{sv^r3`!idVI{ޡ#lK@ ۵MF{mz؆H;;?G99V㮘#<#nXb̨ ߝJWZѶ^rdv*m0><#nXH}x@_ NPxAmuh(-2*Z-|Nz) 佸&M"t`QH}EG42 i8Z%42*FԲAxp+@rUYxXBն^ +KSZƯXlla b{=FQ،e"sI)SNrf##ܸ'tMZWX' }x" 9;Z+-_1<Ż-#^6Z;'].Wz6DZ+Vi =Kڑ!=u^<.y %>(ɢWȯ%؏HM.dFs(_nҜYhيb=N )*.rQL@m~B$#%?#EhKB\a;yPrV P>nTD:)_=$[$q$MtcV]fNh(뢼s T,G7ObNhPHAXhAe@3s1 EkCC& x'B5Dq]52~ۍ#g=`w!4dik}tG)#L_]pto Pp~]x'<]D~~e5*AJ;K|VA#vQm']$xxpŽ d `𭋝u=bGxqo7z>:2u5t Br2rܤVM daR_.E3Exԑ6RXaUL98l+)n̏nuUTPFQ x!v-g!#:䶬g]ye?;JDmDG0j0ʟ![U7o.{UAqo޶ ̿5i)FVƲUkLBkN҄[ۓH&C ȿL *1(?Oʙ Ȭd=pE!Ŵ;xeEEdŒUQQeݝEs-Q%H$:R¬lN鷐M0 pE}̨Ɣjx6M3?LG#~F 6䠭u=r ERu~!i|7˱<8ԙI&Sv[+ERo+aiAơ,[aEujV:k9FB頬@{տc?䮒v'tG҈`+cq (FVqҜw3m"=0vdtҟo%̤:l22šMK~CgG6·Xn"ߓ|]Yƈ< aSe HO!P8<TaqsV91?2qăqB:yuN=HK'e6bz:dl3(wMˆnƘi#]53insg|QpK)vʝI`5ID4)GDǓ(Lޢ& 3&}U0+=!\*uO[$=%9Nqc}Җ/tc'gEmۻ= 䬄܁UH#r (8%; 9LC, |֓N7_8Lg3 vF&8q 8[e  C.XZʌQ'6sICf>]]J 7N">hQ [o/eԚyO{DoEX Ԅv`@W T;b1h'DNC1N͢S|#lYlc*RPAo% k7Fך'KӜ$+:f5/5'es90Ki;Nw//6Ol1sY-2.0t&-=В9fa}޼4=0}E\*kXi32 &/Z!b.hhFdMc>i%7ﱛRiai=ZHW=b}Iy@ޘʐKXhD*`_@ 7y> Ao˳￞4ĦIX>CRI1N/(ʣ#mͳx$~) ?=c7wf[S@ʚħf~969 g=>1Pm:Z^FGG"YmN؆Ojw_9G3EotX>L4KW @B3Z@oGIJ!E0X"*?F@E AC]:,h.BEQSt\ch. x@^OVO鳩MSI7rMx≾I:ǷJմf#jY/{👠_HJٛbWX8`b*DַpaVO'vz){:݅ m݈.f{rWo3 / >"H#P`."KHWcy~%ׯ?8Hv)Rp_z1^mY 9dԧ0=JwUn|h$;`5SݸϟjZbI2mRT0 Q^sJa]ͺ(ϘLȝ rFr${@'ĤǃĜ}ڣ%G ^4nRG _=(C@T;"v$ bF!rЊxx~^"W19:o+gy>Lӏgj^}y| ~AM|U;EÓ/n&:ȧt#-G|fEZU*raTEeŋx< !\[.t,ɍ*ra\'] p^9f&>oeXXJk^+|&>O~"oDA:<'{lhI/2?^:'.q,(x$qK%3pGc?'Ylb'5^m7tqLjHғͨip"_$6x4JԮ봛 eJ]JyZa꼵B 6a}Y;GQר / OV0!?]q*zx|AB$T,o)dVǟžȽP@'fe0@c$c>BU1Oԅ'4<~Xp|"\ П{iF'Gu!>]kpz5k?b|z 犞0qk3[l):NZ0/xLU||=፩%}CQ"?A","IlcR ب*֑4B ᤝ# 'MÊbEvh }?Nin)3SA66`ijɹm®땚M(kĿ ,as9n+Ko'9(H-7]_OenmUwvfflYcm;}+i 6(Z<=zq4j-RD$ƲTVF&( oT]J4Ƹ'z/u|b:2duNF;2s r Z, )s旋a E 6(קE.^,gCkkeDARЊFb~dUA,4&o`k );xYZ~~ވH<% zJXOH =̿Xr!DĠIGA~43~6P^J,7c O1ʹ"MYA4ݾ}!ȭڝcs.*$nDTf9F:L٘ד`Jtw)3Fޫ~11=|ff9玁JGb/igJ핍qdm>iT?F{Q1aN/Ƙ*jF848z)YXR?Z)zҎHqDy;3t\fDrzdQSP~[W;0kD B^`G.]ELDLlzC^lY(f³ۥ2Z 5IvuEhM?8W\FފgL%b '5"ݑ/[NrőB| "Dp?򹛊뭸l* ϥuw޺'/9= ޮpyo'Sq 6֛|Oؗ 'v;Jt1 Pʂ_¤e1ϵ8fhfm]g<{jb% {]>]ȖOXb:jTHܩE3.%U Jz1~n,Yɱӎ]O52/բrdm,2! >{-'=j-$~qxRj¨+[VZO^ۀHZһ,4Q+d38*]įn^jI^be6| 7r"7B~ w˻Fо@$+l؋XOI sf]! =5Wcb]F>UƬalC&I)0$"2rhry43 iDn湌=NsODBY'=ߦJoNnH NDIO[.P7U#v䤸E7kEUǒѦP\Z\Mr6^TbjHw_gnjtYXcZ5=M1Tpnm<-fR 2R^Kܥt>^LyuQOؠ5L1-Xt1CkOyc]d쾖7B۫fS/ )1#}۾@:(t(lJ"7]QrNWKD˫X#ZEaH-Lg;'9K狴f95)@R#<םT}m>GFjbHcW(WlCF$[`($Gf7en^?%LWDt<}Z66t 9~Xs?X{/ſ#TCqyNγR?+rm}'ڋB"Y7d'Q~\L3YNswXV'Ye[OgUX¤#RQԮ"=1yG~&yɀ_@m]`qgVWgT24 |y 6B)/r/f+BSM P%.^Pԇ&Âb1V-ܮCXN+4HE1 ?"nYAHOk1ELߑ{x/o@YNO iH)x-KnaґW0p 1p /T <r"xg2̫|iJ)OW* %i7$vcL?,GysY$HNҩܷSɒуza,Íʈ78GA}LK[I1!~38fO_,fyb,:`"Y_@+Ē%;y;Ҁ4r|1609JǙR-8GgG#Լ>܏&Rnde s&6ywWf-4ukdD15RJ~oAN]D2^C_rz䀨(Ə`.$Gx*\i$R2b`5K@:ub7|\OhG i)$ ]hK8 iؗ$~źý,ȶ3Og#R;:MUjO_Э=1ruӮ'G'V}"=.֒ac9kTA[`j$ Ṗ-$.b;LP|d֧iKʊS<%5sl{*UV(`W敝y/s-!47?u9w]e:nov^wL+$综_-O5y5+䰨QH$OO/d'0%P&px'Ӆh\\/؊ܬ=P͸ͬLO-(msT 6`4v{\ʄ6zA^7dcplȑ݃m15gu~wDv5^=IdJ ] IoQS{'kXJ׊⼳;BOZNB#q4#OcQ 0))b Dԅ7{|dZ*k]4)▧?朴%YkqN7JuFc>;b=Oc{ KAEk4u;?-M 1PD#+u"UOVqhc}}~__B b oPkC~vp )vׂ'*1EK^L~d0{N9ʘ Ӯp>:66>qе#R%hx-=#'J4 9^}iscN&bɿ4L Rg>]CeTt>E*N|u݇=qNi2F|A/L,DQ^4yaUF'(O:(L=HgGlSy O7wi∐V!/,y0l{qYE E~"I }1MY FFn @z%^-Y(f tPGc2#t)jd HuܘḦuIsAk˯ڀ_Sn7> lAOl Zty:|,y&p|֌T"$l# Ej=4+] !QE*?2a)˲} SImFX?o9YmgյjrPi~XjFaD9{#ڙ#=J=Z|bȟ8(ij|A]ٜ+jX!QǶ ՅRms5L֐)>cDEeXJނі:|4,y1 o\WQ Q90ŶIj{'2$R-f-DR~A]D>avUl<#6~Xx c>)s$B,$;ԇ!BQ^UҋA7 >>T;ok9Ij f:h?S@_,T`Yuv"3t@:'U\A1=2|#[RZLn wV%>IhEOm #h "RbyɌWwPzv]s=wUå*<:џ0/rLWX}7zU_Me{ϰ J:!޺<`-4RPFJI~l˨gtx͉kRjfHYk#lG^nZ^*uEKABr)鋱F^$j 8,)q4-v7Wlw_&C^d S>e-33jf-t/0(+>:JC<9M%,[H0SEڨ˜a$KKD5'>m>#jm<"uW[WP|,0,db+R@ p@2$X$jqi2}`OE9zoe䶬6.EtVr&=0Ś[ת эJ%X{ofޑY3Ax9?܏2fgL6sZ㚹OckDW䓮)xg"MbA4-+ O̧V$T銷X u6aqݶ(Z1Rլ)hGF=M,K`5=f,4:h 摢 |xyv:DGOV.d/.azR4bEE~'@gs_U5)|f}Ӧַ)]y{ JKhs1}=_k]T>>umt\F!UExiv71 Չtc5Fur^V!-dg+!r/X{SӰBnNo=d:$Qp4OMJow4q^=b&rlU1ђŐxN4H7ILtZUJV 4W Eܔ=I1+'oBVͶgCf% =vKZzy~&"h%'d\sXdƊ D|7ȯ_doO_IKR-FcD{ S<Mѹ5_ *$Mmu0:!7`ZVEo^{P$NxaOR֥Nc)G#F4|vK< yb-޺кtB B6Ǖz[l{)7uJyMyWc9kG%66?j̃%KG6wW;hz8t9+t~ yRӼ]`-S'HZʽF!<ӗg=7Qϊ?H"C%k} @- KqOg7GV_wsv7>ɚ4M!^gzz-&}+[ܮj:+r.jD?S"Β,cNSc٢ӽ늻gFatx+hH57F"_sxl:Q6?S\:`Dqb<1UjVi|aw=S#}l]0<.5YWa60ueuz(;mH)~(I7#I>c+{P~ds2i k}IzAYnr;k.59ƥjZi,BQGhh,t 0vb6b^9)Tr.YAO~M|b G9W\|Ӽ5pҎ{rxɎJ:yNm{"T-Jr '-/зiq͈,I:x泤+Z"YCuJZ[^%;49K4N0)8I߳e͚54azMb'ѬԬKOH>ײ XS{9zkvE%&4K!Z%r{!suYEa?Tnև9MX@ɏ\yq^rT\3;iF{uiݬ gHTyd>>I'W}"1AHgR}P(l,uRbyཟ©acV1@k徤&*>;<7E22\j2VT| Yg^< ~ ^G ~>P$|#*Z>:PݽvkٵVD1!x)ٍpo NJD4Ob:ʃ`&POOin4 qTd joB kBb"zq91>-^L1a|S=cG%yɕZc/6 ,e'|Σ.w+k{ci_fA"M'Fn[fYIKJˤnAxؖubHMS!/0owݫL7cQV,M/hѣ4c\۱_|kã=$1OY<%.^,k渷#ΘC}26ϾYeu>uiAؔtuF)ab1ML.^?彥<7p\4ưԼ\0#48Z|*'ֺy)Xўq9D6(>n*ok$nЇjg8B}zame ͞דVCi5͑ނ2ݦ=6blq ~TglR U1Gt'$BH $0>R-o|MEC]<Qގl9[Rv6|7?"6Nj\rF٢GT̏jښJ^6?hC}/>XCRhyRUi+:$Dou3A00؏oτSG{! WZ? "QzψӴ@,"R?jܡrٿ?&bޥZ" ejHwwlHVYWxN!N.9Z)"\Sₛ9'զR+K盔gf]?q\4޵o%:l?rpgZYF,/Aۻ(&y+X2YAb/}@ËseNcm/WAbF>ڧk"4B\rUq=h: aeԙq{ dr_[H#aL"@މ@REgtAS6,vsa% .Yyss3y޿>QE?^O$a>GY(m)U1sjw]|ywQك[ *xkXKBQ?UTxmkNSH5t]r#!D)GҊ%mp"e-Γ}^*{stV}wCoxӘ/&cBZMȖ ɮBڏSk!=Qj$^`9G]1! 㠖'WyR#Ij⦵@Z-K[Q~yw{i]U444Y} L#dPfcnSM ZC.c#q&T^~Ѷ= qH|!WD\.ˏ/bref$oeMY&b[׳oi%{{Ļڢ}G=1lu5ss:(Ά|>v_&袵3rVd@"GԶ+KQYhDQ,V4-tOp&&H4FHirXkdH-n$2#BԣkϵY$ &,'GҋL?xO=ˬ֚Bu#UPܴd[ޑxh['l;w栕nfIïdIA41IGX,! CD}H̒q_w*=K[)(i4U|ۧ#mp0uw%:KCƤ3Ӄ}2'!4oVcCWkw4<>4hMW~ysُa2cCERi5coee2u8\\{b/]5S8A\\ R|2^/,aͽE<>_o x`Hΰ'DʤN,X%gv|ݭ'ryOY>^[k 5J{w0 oTOS=`uz1ľwzVqH 2?2q1Ǡ. 2be&)uԭ\Ymm: qt͡-:d[ ?[ |/B!$BpOpn`?5oC:1>GleZ@PEҌŌ LNq?b|(ߋ)<}DkB}!wJ"UeF~ىzKvؖa[BvZ`/+$!1ó 野 | 9 1RL%x ~TMy}/y+Y`.kJ&I3ԽTq4 jZz '|!PzV\!8XE6r_JRF{e[z=߹p_ql7+mJuh'd<VhtM8j#˗$îәcnꅋ|36P,u2$2ojW?~0[vUۢ}|ךy˩ R+] V1՚.كy!nlK9TTSsK'~8|Oc)Zj=GU3eaLp#U6UӾ?\h RԳIe6 +t|R!z 5Me)6<S|BX`Gq;~Y=}[p7|O8!SN3YM:[j46".`w\a-GAik YiFj*%)2:t"+~%?(C^{9G]I:(km|[0~:} U7ݎ\OsF |k6M:|hn?uG݅w$2Ƽ~[]'ItE}zZޭnM{LR=X6/6!_,S9cdr(p :oJQFCgB8 #R>\t1HZF63)^e#=K %Xm,>atVa_m敬c\4X6SLb֡晛&*du^O_"p fʣmDЀ=%)N~>14ף?ÃLK2ҔPxmtzZ]E\Y5$O|!Hf$ԛGlx KUtҽV15Mm4~1 8Vj;oYJrCeE-y,sG{ga~Qt2YyRiu3Վt}63ݧ.h&; #Y'4bs Sָܕ)r>p'$?V*97$%SoZG/?:xV6q/9T8:RfG"C˺dv%I 4di)Cz7e~SVRO1I,"wPc,͘_E/_k$~GK)UO5'itShč8H{kc>5F#bvN?^ZuʹZ[d[kϼ:y'0:Jm|N.  _T xdx9˷ 0*EJ牢FZSdWKD=2MU)Y&˺f~G Ӝޑljіnԡt=5ֲ~ȹ\iO^輌I,gR>G-?#Վ!{BA|u {cIg,\xlˆws8&?Ѫ$P`YJsZd r=a4\y; gu2ݫ|>mtSO XG:d|ido}R,^Z(; lIF!Fex|5$uy^|u2\VZ?%*;=guX^;h,n=rz*J߀}hb-}u5m\svSf6^5xr>w;Un@K8KI:e߰hp|죟&n~eUNVEх>3Eidi{YzF{NɸGϙ⮛9ݻmgNbwZS-`W嬜Zº{yE6|j>-60E,4YIE"~B? ˰ IbhĈ‰"NX2⸸"K*p ؋N0PPp$@B"G1ƾi1m<[z,L)-k)l_ͱmֽ%_>X6F(ˮu.n窐k|D">_M2TUOᏉɇ!${$3^$*3$B"l!ܕ0JrHX&PPv8R"MA3aMOBg2z6yatkj"/D.W,:7[ͽʣ(eFQce:$=Xm{B5=kpo%J~5%{yWlVv4xabgh} Yb ˄Ue.d4Ƣ -n`((M$bhZO86h5mQֹa#R8Nj9gW7afDZ,sv!;(`@k߫e_uP~6_Z,jrJ m46'L{C&1=/h\k$Zm<olԗ' ?K{ R=nO v(ZZ#^JV:紧6 qDŽ|y|,gx{u6F*(pm5|Z}Z 3xղq>!c5e:o,c;-#ԶITnS:ҨZ>y{-}LJY;jTYի=]7h?]i1! dh0\ψ؉CNKԅ\7>z{,'&&EZC|qӉySޙ4e|ϑΒR>XKC@ Rgoxb6Ct-*) lx0ؿx0.9ǽF=7O<&v'-/Yc>F7A\ |ܫC܍_Vb̀!-3<֦/JmA[䢤,A;ϓ5,uA9AˊH%!4D) 1!LyduH_9h924EApA>.]#m(#wQh_Qhd=28c(ja / 7|E'i/gagEm<$q(t1Lszt&ciD5){$9'塁jqڀt+Fx¼:#ʈ1rSN^%%zy<<,"9t} > pL8̍o=xċYZKw[/}&_oĕfmc,Y)쮋LZ5G>uĺ"o,"QgRNW?m)=x<]3BƎQ 3Dӣ*qhzCZɑ~V W5hNGGc *॓V%k_dNB^9t@*F}2wi{_{ng5gy~Lnwf˫Ec,s'cMa&Gw|-?Wݺys/3勯IJBzK?^uS@ۤO[ 4c0Yʇ`W+A:  & 5I2D] )bKx|Ūv()2$ # I"Sܗ YQn#/qb( XayH?{ᛸBD78g21v CgգrgwJ Bjxb0:vd+Oq"GQyOTE~8Ɖ!hxY]tuZ>/@L⛖KyM*+V-iL/yce>ELW*m~]Ou7H^ ?nE,*{lJ8i'c)&m K9U殖V.SVo }~1ɹ"+0̗b]!I<!OY Nr@e ;t?bk]q'7<LŽǹ(RYKw7mċ@+, x=:v(B%2ӹuS*sc팫wၝkhf DkD|,Si{j;VVN'Ib%m 6>hhnF8o$%(*j6,f;5 ̢7^&q?}|9uiИ(Q$%I3 mR[4[AάCB3="{eQ-]y7 :<%GC9}GOw 6䅽c6ˎ ogWdPw=wFWa#s'ln"2hkiCb _rZ֙._q5U]Y1`hÂXQ `^Ȇ[B-LtC9Ȣ( C$DIHFeܵ;W'/-p-U-J뭚E|6Dp^d4Niri(}r%WX?yGEcl}%N&6NbMmUzz?.ivu$dy\G=k_p{&@iWm?=:I|Kn&bsr[;?!ޓD~>bXNf*$(h(b(0[B?oB3tlJɧF96Af!܎cPJ &Hlr >CL0mRylqoAe6ԥ^|.D,M3DF;VDkcF[sF?*w#iiadu8r{@gcTgxwo& Ĵ,ΕQY p𨫞–5zs\Bs:"B7heQ|WMFXFU)?_HS {H#wV)oGGIeE)snPdz[bk9RC$fF1CL[Reƾ9=9ûYiܝʴ|)inA#_a#/=ZY0'6_Ƿ Im~Se9i#'8jx#M[?L4DOD jEgɈA2soգRtb4X18<8Nw೴8͋ۈ1ǩ^G7}MN;63d4F>=\vyԕ٥=_/ +yKTuJwhMֽ% kbye}!t$;i^WBS.R7VXv+KuYnL옺ݿZl|Herw [s d?0a4')X$ #]-/;0 p@Bs#6F6h^Hlbm8@ńI:yû?z`ݚjxbQ>5ܔl3q-U#:63E2"kDG,YY&9fN̜8v33333[d5sݽwY'}1{78;Ա 7Su~Er $i4qzrh5){+NeׅNq?\~r}pAF\|kpv]T[Mek^_}Y[R5}u&OAn q,l$O=%_P 07ЄFJ.Y?{ . X,uYͽ} Ԏ3'D$9MS_RKe!W 3o7dZA%+O"Xq-p^tћi~CbVgOO* T(eL*fkt:[{ǫ"˧4p-O䀪|lSFʝlS[MBqr Nˆrbr\/s|`BVjv^6>mf$8G$?9]+ OLJ//ۢS!@lį/P{| +yN:Ae~ȥIڪW֝UR_y[/ }^~]̈RWPr+]%x̀؞Q.~m4CO?.?+8H[WuW-^lrf*e 滇Pqa$&4տY E2Kٜ"0_Kv.=44_0K{^Z Ϥ4"jcs,vI}n TDED*)FJ]d8z@G_ u%Wxe^SJIX7C5HʒSΫexwEWuzFQ;fjN+o岼{f{V֦jި#/0ݽ]xHG,>( xR¦`+5GM-8RT50Yd+eA _S`=1FF%KWy~ESK 7))ЛxxH~F0Ǟ#J)YV5̮m.NSb}=zZx_?w&-#p1(Mw~ <&@{6n Ƌ+SzrSVw>\$AUyDKr6 ^m^-rY[=0m@o1fM0z+"ވ6,&h+:]teͫE?d]Ƭji~?=2!d8=-tG1]/CW ]-8kI&U6ٛ8YREm]si ,B}[]okY凚VJRA9^D9J+&٫4<5 TfnBwzb4]9^kvdO^?79Hi>jn} j=V_:8WpM)V]7|>XI%>^^⣫l0z9CH(=$U+JE+# YD d IwwlILiilXAHUzCIbKM+YvE..4w]^mU""[iJg RYNj+t/x}[4T.+h;#_C]|6I:U9_()MpMYc nȅVD+ʹpTNO[(<g)E0s| c1i6&c/ܪ9}kjB5g-b+nl_ X>2$\jGj?UVSi)J˵YS(Zlt qZoi?Apwo#z(+jG*7Ioޘ/}o@rȬ1h@e_wu͟l$]UCo-㫳<2c99)Su#{J*cY<@نs\xyr v҃dm!}LO""z)z&阒;ҋmR*=+׃ Qʭ(x9XJ''|zwi$=BxKw[ohW2!w^L)^Tl"{ݮv=s5Jfѻr^ft!w@wnkwV2_&FL~y0Rg^t"u=}E>cכRC b`ͿF !G9Hr!܅a!Ű4[K-N)#`\%C")nA)h -*6U.4gQfk˶l*K{o^%ħP VƳZ~׊SYlc-61O*3k(4MCN* } 68[ I RL#'A$t#E,"1x!5FMk68ϪT).JVHyl6o1'Gq^^7: Q q8*)9>q=4Oh%9'"wG5_ΥOa q?Co_ , "V<Ҽ*"ǯxIp]Q2 vNhu *yfV;:̿㆓#kbUF.vUҽW[>F)=L':;p枦ӗ\y<en!=!yn}'Qzl ?Gi|Jt o4ooA]F{0 @E?"|gMR^pnyeo}sIĽWz]Խפ%բn/?*Gޘ_Oy oopiwm< .9':x=.4_`%H80~WO2Bp_Gp?oD^,ͦ_VL/K*Ohky=JioVb #F|a/SBnCW `3$,Bt`|\(?"^ۨVr$~چs;gKɼƪ{~Q+rE U:,t%{"I4R)_ BA+;O--Ϛ]:i3?87T{=  db%Mo-3<'q|r>J$|Nvp0M< Bȟ #z _BA/M &PAKA( AD i"A4 _BA/M &PAKA( AD i"A4 _BA/M &PAKA( AD i"A4 B^@@d:`'A?苦?{A  ^ . >"( /p!A`E* PU@ *PA/,|s\tִ0򃪟kJʿQȆX5* "{@;i>$g[.^5|t<rrJN{`|FO碖<ԞDv lb_AL^C2ZA<Zˍ6Տ o';4H0ahn߇:\ژB-yЮԇfJ LPF_Z E yAW5nQmP䚇Vh}}'ElCuDB1B\1w_Q1ĪQA! 'Wi[2ioab~~m̝s]gh09-r;\k/~y$s=ʣ °c0[e#A3p ^Jx (~bzco {Ww͵8ml,/#;nRRyWɷf vEPA H՟,jBәqYjg96TՍ5=l~]/פ`d+3Nޒ'،DPA=BA!PLS(ߥ U/լɊʀ)vUnn]F=h=;˃C#N rLT&gH.I)#j$8 y틅/Xߞ A{XnvY*dzKnka)eABL+31~:SR޻HQS=c^h0Jb#.F( I;Qek_jalh+U/>Wɷ;>|n!%ʇNq\ιhwN\ A( Gp/};j"UE%LKUrEy#P= f׿U =t:~]Ĺ ErHFFM!DA%O xL⍔:RSP=؎ʨ6&Q6zۺ8Ԫa{! ķ:%R~{~9 ~|/{(PA ڠ:֬2zת(φnƱiLL'MRS}I U:~}*@3]ve I !/0pLl#AJ c{r]*r֑cbunyv/-H9O)g{GAkOkMyC =F*> SA<FGY/68HRJ"^Չ>UP>g~Gq"nzco;=-IO,JWqY"AXk-ў;3.뛮)RTᑈB @0h/ߞ AEfkg>Dօ4c ޼q_I:^9x뾃Z [5 i|+ӓOLj,=TF]A( fT_+>Ct=Od,LS*w1u A;=nL֎̱KN nKVGHAʠBA!/RgHcS.yu.IN -o}h{.pg#y C>GG{fz~˙R~62aA( f"4# 5ܹy%Mc#Q[ @ B^ЗtG}Qb$c< ҇%M[/׈~A( )\8bqdv:]v(?Q Q'G (h-]#ыyP4յ0pEsAk(bgA!o^间7bM[5 ^B1 ՗O>OK07 yY7{>*W-H|#7Nm B1rO^gUezyוG7>m㇞ĥm4uάub |Z\U-QE,"A <Fj?$fPB3w&^%4QkKJ.cmPXMÕV9Qe` IF` bը (r7Uڵ*xRJRz˫gr$nI `? \ 1@hD  G( E֓;I[ySe_~O%?ǔ|Bޖ) +.gU|ZVE:.B.z B^N8{7eE;;mͲx7ϭJ=雗,\%O>u>DZk&Oy>0{em+¼ BP^y9{vΥrC$e)oJx.ǧOP;mo}9Ҿ5.G(Ai [d,PAx?~qך^ lɖBI Mz`}CkϢwl3{I!g]WxeEnZd)LG|D yA,|avTOMjr6b&ʺv|#tTUC[Aȷ!ow"A<g"Mv0]6tAAd yrwO굳D1'xWyb5׎V-5мCC)7X|Lg}Uyr١ a&IR٠2 B@Hr'^=5(=)U)q+evStU=\Zb^0$XrNeeAאg3tE_gݠ41MeoYS0X%#!= Pwv 8RDzѥߖBSx_pD yI:+r^r iDV}.[\ tZ &G%Ī%vzYքŚPg>g#4VOLM A(  v,xIzJ'kmnIIq 2-sqM0UEe5uS}5LӞSG30,~\A( JM~G84|w2c͔)9`6givQ1@i`^| ! .w'riF4ٗ˺xa^?o8TYnϑ~Ɨ ޏKRϿNT ?w5HH.Aʅ5|fkjvrY37Kd& ]9fʠV_$wO ڴkOo]X5<07JΣ &#APu{UHKdN0{'Q~Wv\wŤVow[yoz 8^Ac 9D!QT:DVV*DjPJ7g;ʚʆNm+N.My)|#";C0Y X S[~Uxt B^-ԪRli~fgytȢEـ*zYXz~$YR*Z}8qaКЩJ(BA!PsE}_jWd!J/$Kk&T%_ Wu=GM$Lggԡv?k8hӸ y-Mސu%߻jS*= &7y(}OL*~gwѿ ` #q B^Ld0욳/77v;}k3'$+xʋ5o:<=wWo=ыVF("A-m욜Z {w_oM6ׇkKX=&3дY#,OJm*( {E yO鬬7&[MM4$SuRUZ!]vhhiG*A6њ뉈1lU#C ۈEFJOh~; NǓܰ3|T ɽ>L;UC~6]Nrccko?0ov{QՓm"A<%ODFFzn':]]P=HoԾ _*ĶB(U= yp}6]O3ȋG|p&:yMRuD ⬬L ifhS27#V\,,N& f3xoziE=}g斢C/X^-hRߞ h-j㷇"A|`j0~D 2x}BïCV^bcNN/@&iO*t4S|A|&]y>R-DY,{De?*h;l=]DVJ&=+dUhdh!TIk$%X ^R<͠14t +5}ɇ%X]OϰtJKikVeVqVݢq/kCnRA L h6&ݡ|h fIf73zfq J-^fzNK:eh>֚ED6),7c]zIw0)%Z^Vɴɲ=i ʱG4F!bh ESX8[N Zjɖ0-n,pLi6H2 ikIcTd"I34Nga#:g8{JОDl󣅥q,FTÖP#Ϭt],bX Nvx~İs0Ig6=Y0]ͼYE*ӮlMJ#)M0J%::v͑nѝ,ٳuU~c =’NrYZML߲p5k%_a-t6iPZîђi~f ZMEVA}fR?v` mBJ ;E$-{"zrXM˳kl 2Bh9A޲l; iCKN1GeW⥣Hl=BHoYVDM +h1֋ BHu6TzKw0;M3o+BIڝzR)ceiu%l}'b4e93G7Z]{h_6='A̗PDW< Ѭ lʧ& B. z2OZ";FekR4лt>z0i9KXgz~Ht#bideimzTVK,]4%:.eh-ZPZ"l,L;LJD6I &B~'JfIz a+ɬ+Y;AjBNi CNH3=vNJvfQt'MSo ˦M^%د5͕`wX9f}i+lK`6:QciYj~t3C;l¦;4X^9I!G4E<, N{LvȞlӾlƁuOĄhV^3S;'*U+,l)i%0{p{=rR܍׮%[SF Ic=++ȸ:GIm39*78SܹaX\K!m)D|{UR=S &sek{/x'i>[(=ARK Z7Na KvW[S[mlrX[eu6fY>ת&I ]vMjk[I[)GshxS/TǙ Se륻j0HꞪ={ -ƾڪjPV̳Kަ43d60ͷRUbTOR-pqu/|Hg2~|2Qϳ4um&K>VX s5,vMnKCf\Kcx/{{,moXӳ[JJJY|Mި$/YL{\m 14^59ζ=k[ iLR-ppUq5ֶ /Zn:k}e;\C R_:zojȮl*h]^USxAZZJhΚgc) R QUsrzݬ+il:che4nfTrqݥuu{Uh/atkg8ͮ(j1j.Md6cmٮ~[杶kQVz4ۑIJξ>5$gjm uISri妹u}M˺ľQՍIXIZl]lyXRr<>Y0sqfj41}=S^sNՆt'EI\OF%pH;G=6iw7,8yƸ/\eNMtI9ͽmƏ`Csz' /F5Ϸ\fTTu^Ok9:>?kkKݴ=1Ȣ斉b|Zy4wq:ı-Qcݨ%tLuI9FkM{rf,^Yij>m}C;1+j wsWwlt ]hh+cvz9g6JNڵ%~NkqEm}'fMKIv6i>0&QgB9o>Csq/a#Q{;om=uR@673 cm];SǍz=pXxz]eR4+UGiujMj˼igOYʻi{KY@[a6.DޡS\޷!$ƶ~|Z St8]_KzG*Ox@`DK[㡻LMzx`{90gT}R7N̯}t D9+j$W~Gx+I[ 4ʞ de6ٞal+r;%-Թy5I&7 h=fIQ (G+ -Hu]p+{=:h7sߣ~#MN,hS݂勱t-/S.( e+]s͹ne&U)LXOx ]R/e ~b ִd/77)ypmc\K-#k5^# lbNk89]˧w &weG9[nG:cL%XC/G[1d~UJ.f5ޣ9eo?oI[^t?)4PUv^ el6Y[}/=D]|_8ʷR#g&9s)&Bjb猷vqfdOaA1 ;#%rk%R/^ Ű.*7KMX{RV*눱'Hߔ"JW7 ~K>v:]ogI7v[*&C?O:)* Mic)mcl6ACcEA7Fۗi_Rrޞ-agiRV]'4&JXɧW7ggg@HҝxU|'wlZvneC:ZY&qWΆ,x8#7W5d)ڀ&k-Mr2O;4CԷT7إI撶L]%UEa#j҅F&=*y{pݥ喦Nl;K>Re4IrynF2ȯѰx޲n+$>l SSo9{:}_ywSM'(*}ސ+R\RQHe$oX}n"羱h~iJ]{+T?sG"vp,wdh'2_NV+<юUGGg3wQڊ&}e[A羏gָfx~򨈕($ C ;XݧEux93 ?-i9#y7˦5ڔd}ODrH} 1zGieU7=fik\.M /-eT*i(ۛK-9%,*zyR#@7D;tū'4;"oK4?~֙oyb:vHX]6)x ̳e2t k}Plㇺͥ>ky)tH]&n~y >,T=E_C t}$窫_tc4PepOsgA ґt! a5eؿPG }KJ5T" @A='y% ne(H^mDD#HF:r-P8҅g8C#.hJ(JbH@BIHj!@AfF;XK&` +؊Ӹ|/> Y5vY|m/衁$ONQEa>_rKP|" o +$ Bħ! G|A&&, hQWE4 O B ! aWH"\&fu 2 ȏP'|#l&S;%<@| pL 0/D.$H`=l x":iPCC.,.ʡ dOF!C#LC#EIQxdcz9 Gs+PgTr2gqRD!Td>6X3ґC -[xC5PCEtK6q3Jΐ!C.xPFvb:͋#@€l`EE2HK^D$B)| ?!aD+L⫿U]GdB- P Cg]OZ~p3ҐMb7c*_sAܐ!D#fؾBȏP 3I_6|" |Eh(Oa>P>?! YV&L[o %LZ0E@^! id4"U8ȏ-RNc'`?s7 0 ; K}\Z Б+XI=t0J#']j/>#֨H&E(hobi?xAN{x$S~ 1o/ud68oK\,a%/L?c_}\Zhi,zY@v8-<x5l A!1t_PA9FXtDCTE /K1,$Coxf`#"HFna  8Ưc3N" omD5+73t1={ ߧ(?B@b>ċ3 o衅 V8PECVbЖOB,",L&͗_>1iR>^#Zq#ߋE>WlU%0$! I$?W2B]RQ fizcqGГD 8kxXC_m"zTXtCommentxs.JM,IMQ(,Pp 7}IENDB`rickshaw-1.4.6/examples/screenshots/stops.png000066400000000000000000002012111225123340100213570ustar00rootroot00000000000000PNG  IHDR,FsRGB pHYs+tIMEWtEXtCommentCreated with GIMPW IDATxymWU&1\Nw%}- EiDia ;{VQ RA= I DCB Hwssv9>Wq:lF}cypBN 7xBNWO?ןOD's+>|˙olщ9!'v'~齿#rbEN #ۻY0^ 9! Bc8`DFzBNmF!^7xbQN ]0:Bx.9('ܮFK]П@'~Fhc)j,o<KK^2wޯOrBn'#oLTGсFv]?'hN psmieitqv{WHJOס6TbL[R!X%'SWOrO>O|!הrZe~O^w=7_tEgx3?S?k?pz$DcDf6OOA֐%R26Bd9}m$3#?r9?Qj盯j罫晩ư^U2stӧN޺w^dr_ JcXEi @T<w>ӇW ڙ07v@: ",Ba;~ N-ò8?@cx/?|3f֯We9!w54,.5Q-fIsD_Pd 67߼>UJE'4mS[g} %_E'Ȏ*N_{ӟtFƙP0DImMܔ'ŧ?ទ8y7x_?^~oVɯ~i+AFㅅMY2wAulx)v%]EgrGu93 z}e `74w԰V-(9A; H?x?_rGKEnmv[N#Ьĥ0}--6f):gcG4{eD:tWY3W>q`֙vjDC׾YysUSe  sKYiK %a,3k/znqU/4 nyi35H>]?^s*4If;YhtD'=F.`sPddeJ ^~5{ӿ1GUs =mn43,O~>O/8Եgz}zGT"_u[-N.w|>xG=5̬fԸQJt;Nf sL7}=8pʃG#tys!JT#mf+$si垳 ULN3[p~ϧ?ݍAifs)cU[$ajn.-Lsi}:i~N|ܟ ;riydW/7]N֩|A#3ʅLѤlG^)*[.')ϯ?z.Cx _u3--m"DF T9ԪU23uf+k,I@L ibd6Ȥ J Y%ؒӸ`/_i.{ -&yj+0Uc$>ԁL`B|L4xUy0y෽5[eb׾Pǿȟ|W~}NǞ>rM2\hnaT0Ֆ3Ӿ4b>C(Έ^j@[anQDaos*[;&rX5g}WglʜV 56t6#Qf\+EPeYokzrmKX0 8B8+OyÝbc˭˞n2͜ @ rύ`8癒 Pf3ݨxRn"*G`(ŵW}/~oA:'Bv_)˼o^ޢpF2r0Q8PZj ’@)-WTY1;Ndu`nӸs-U9q0fW3h-_{}WOwo4~ ?W^r'_Ҫi6"l=tq W(Q&BcrLANEqH^špT[pxP"&Q^ǖ`3|;NOC׿O1"Q~[ZޖrX^cJM玆AD x=|=DzJ/` A vE⤇|;)ß'eyhh{晅͊#'ؒfŹphsM%],SL9sb8UU]wYV!""}΋:t]1O<&w5{cᩇRÜkh*G@lOz x{m9-{+3s}t:9ͧa#ӸYCgE\2*B;"]40;SPZvgBd}_/~IJ3_4+Dϔ aѫ* XN< M5KKYa"fD 97.mehrfG<ܹ%`\i?ПDٗ$׾e8(UV`샽RQ!ء/) 7%KLjhMK椶 ڠuM`D]<QF0jĉM i 5Rɉ]B.M1|ދ/z/da5=߽w}K_{ۓ!X"0"by _o 'Z6_ru|ݿ)_..n2*ƪB&۷rm:l[t 8,q.}_xD{` 4@:I '8&ǟWYUomox}PSzO?V 13.qE86y%R 0xY&9hӕn'j8Jbվ#)-]3YCfY&Ue@´M4muSd_}H;0:ů?EhJo}}6hLpBƈ,n = {rU`XєڼŸDTjDZə 8ZqrNݱHBRԝ,fRU8g1X'?yKo1y='2rfoQ҂tRBIa^JKqT2иWH2(GnZrTċ^=aKug__o/@/|Z]$][- sKɔ%R9MٌcQᔑd֩КU8`zAL i{ljWhsDKNMQ\chkčM.(@m\`V 1X"nY ̶K%4zh46l=*s3 꼗4/ᯔlюr0(k'i G#eLZ9Rc83seF셦MW9U97Q`EN.RI ,n\KjXhsS`BB\ZrlbkLN?-k<ɛ*r:mʕs1ɥ'mbJ\.\k9P Lj"$Hq<6-bz^4:I?KdG|s=}`=axiB'ЎA\CQAS>YUR -A@ 1Q2RjƹY3@衊*὘7qɜdcͳlɋg'?a1U7q?/9w~KŁo~ʢHfbgUN|/d@q!%]"u %3a{ !ni3A12O^`m@{4dQs^-rdD gl*֑"$O\[R3P@ۛ34* V,YHEGv~!f5eޱZy2R*RjhVkakLZSqk[15yRUBI4UJش\",;ajM0\h/qleԃ$2ӝ|9O;uk| J1(;x4rK _Kۢ,^J0*i٠גU(zsJ&?g&2D0Q0 =y}!bܡ&lעr3ĝ Gt+ 6`8Ī5ndiH"KpM`h)A`^/ڤmoZlw'E IDATd ?<2jt?8N~tE݅lc>Z.4*:M Jzx*-nߧ,z ,֎VBG(#ܭknL~) ,17׸A` [ 10eomT50h JG6_iNh+ws( 9^IG]Hn٭+ V\i"h]Q 'M̎;'hT;8hS\^m`]\fӴ㵉hly:,te,=@ȋr{=g;tsБ0$n>U(:t5=i(!G\ӄRT& !Yә @ԙP1j.\P6دxAa;w{}*Ucqͪ3ۺϠV[*e5)b Fkj`Ю zե)RNqCx};!ؠ,< 1`&V&%[LԽV;&T|jut 9Gͨ׭=Y^g z}xcYcxG_NN\gϵ9c"BU'^53[ rRCR M0ʨNM# 1u4]XBd&ޖ A Ț $*d;RŪ_ҚحU7],r2Az.M*V9^jЌfE3MbqDmUg4.xq8# >ZTt}hdhY4wٛ-oG{]ݤВg$#laםuf1"1BGpWF Xj1g$]r7g!ȡ~(<[%1:ZPdWi. eʾB&أp`$GWIkhi 'X-1a\MNeVKi+wD8ڤ St4DhYa'vpBRgakLMldӭ@ k 9D*8&L)R;&e`]qnѨֆ*h<8ːDjN RJu6J7oA f v!+Km޴)e=s6 @o%ސ5l>h{+u.M R1ͭq`s1RN rޫ\Ϩ睖i<:ƅ0m ,l yP ح iiC9B[Cٵ IJb&2`Fas+M(t^1nO(S*QW S 2%]d2&:2,lB{ BDP2c:.dw6 F+E˙vtrqӦ :K-Vem!TdV$Uw7|.N%DBWv*%/YȭyE6L~*0+ !5RO:Lnٙ";vl 3`"2`)aRq +e;kZxXFe8X`ۙyT$X]{ŪsXXr*OfEqi2[JJDaVC5zӌ21zr9J&BT:\c2Ud%vKJ1ϸe/m$L{lz:L1(dފ()GV*#6cʄf'%8alAvkxEs! ƒ` Ѻ.:k1!jh`9'TTR||}7 Ԑ:WbSU")@LʅI.dTnebV2Kα:qY&4lJPR&+_u,ӬmF,f8LIm2\pd﷛ϓ"fi'o_u[۝,C2 2lxB.`RrB9̐90oT[Έ#5i+X}2רbcu{+L!QÈBSt:LnT"lU}&,n xIa2Zo)M-lO(fQd8`Դƌ"5Y,0GeIЊ &we[,tdsE>|e ajIMḇ+,5FpO蠁hq[!.J# !}`u&!gےmzL6 9v}ԺV9Xƒj1"Z`L1f!A;chJJAR[69SN\ʭdS F"lnڨDfsSF#Z!h.uh.#>Jb 10XTVf9u $rk5iPrOC)2 S@iRW,OK!Z4ZiDFMGgiǧU yirMԌzSV]CZ΃SE J;[FW \h7+rK7v n:,ꪷϓ 1-T,mV|:F%4hC3ZRȃTf,QUW78ґSGvx/Iˌ fYrdsۄ4ɚ`cuKuƣ m4\w8듚\ HRC:eA uKt-,T8Z3Nn͜ӲWԁ#LM2ܰdΦ3 &L92T#ʤlmfE;2&2:[.NakS݋uXv fk S4j)i[[y93-A9;KR"kBcC:#%!"ff8VTLה])ZA= &:H;p# eyƹ0a' s*ST4AC@I4,4E qP2Av&OY)7Qxc(dfI!+`{-e##8CА$}a ċlFq2d^ ܴMɪ˱{w͚a֨[~<8R"]ܨd {JNSȵw`-捁sxkk7WSC *1-`j#&T)֠ҁ͍!$q#:xJlhyMlLu[Έn" Jw%]'bRJiպ/^2$eČy\10ǭem ~g&tp1.dEB`DȂk2TkW *ж`CU2Fٰ!l2$SR Is)i0-Pmlgppz0l 6 V{Oym59aQ$>5̙A U;[Pgq`dH; °zHAvmB]hcTI,&^jUV,g6P7BL[Y#\i|5'{hͮ-8ʖ-h]0 8)[' .SNGW?z<;`m % 1*慮/\+G]D˧$+CȜZD j".((* syВFu qE fy^H %QYQ"Jn‚@5?: lnYkb)oY :xC!a kOmcU@Ѯf#aQKsjS[}3e. 0?Ed/O.ͧZWslMT Q3Ld5N#:38l}5DlL;9]$+ @ԢůH#wK/kX$l樮פV+aZ#%ЊjO6\KKA[>7~h.yٽqCU&&rj. W`L{x.^1T;dxɦ'ۍ\]ѺP}>#XTds <Ys&$ p?r&Xi Led>E),&g-lXϒ'c@P@{ж /+8A]Qł}hG %Bb8YP1aln#?6)>$!I * =~>C G,?Ua-]h <>3 )N Kڦh8AbdZW! 3Q?H<%LYBWnI8 Q^(cUBx`|i ^t F<ܡA՞C94=800)vJSkyոhRdŜ:Ս(>6pc#=: l3|L`aT_#P'lѬ*Ѧ("kaq& yj QX* Z|re=cZ]e&]n`dfeu0UAf-LIK/uY"#!>6o\]]6ah!62ª@f$€ܟFQ?agCbl\DC:8ҩ#Qrrh󌘓2گ5EGu3ǣǂmgXBTk|JE3lݸp՘"zE,dҸ A>B<9}@W)3)8#8ՎFV?>]'a^x6~N<117`ґ<"Q"0U>3Q$t'0(; ?o@E2"xZM =%j6,,'$[ܚzܞ98uVENJ[6[ÒJ63jAUsg055;~(Y9Ỵ7P آftj8f9&4VX3`nȓ9VUcja5 F&S"T-SWFUFzvX#BDp/0b9esX0-R5&ղΆ)]2BDUcΪRq2 sBWIYiS:9Mʊτ]c{׳Q!jEX <> cł¤1~I60}]V'g>VcfB0eg:gY_:Q`IzMR RoyJ堈_<,Ajǐr{ϯgr0EEY-ca' 2*Є|i1 v` H)0m쨩;@h?AdセMy5kTDM$f|=w@uTAA@#njmk@a 5d gXV 8Y+r25_s`E+XC8w,>©ǨIKKV bEFUo/!4^:dŧЩ1~/@sg{,!Aٺ$fX6) $#^j6G]c** UIUi} g?¹g M#oX-P"Ǧ2&ct0_eTuX95FG"CUF)ͧhI KE%7cjHXt$1@3[ڂ # @wpڦ$-rq0&~s5)t_I 5[11Nwy~5Qq T;7V&87S@آ! %P`qYoYVcGc.}N:#`aMxӊ @>!ŜE (=]FJFF]'T:R[#lQQ@BWR1h@jMjBԚF.Q}t8Xk?;4@" )ITΉމM@I8 l.]k!30E79LMfۚ~Ssfq⢠1IweN&ܘ'pb?&?KS^dY6KϝCܠv:LLYN)TS q{D¬C!u!Usgk#[)#x$*K,:yԵhC%BJJ=%ǣl|,8IG֤Pִ`-CqcTku #D=ryQ' 8'm* s:0ѕf޴.-r7Qe˸(32eQg@^7c8K r0_lBTqMt>[O py}uveǣ0ߙB$ckyR"!@P qzڏl1hv1Қ@x6܂q(hvS( !TY:*t!)xupf^Ο\ƒ"bYE;);Yg9T1|t߿ogAptAYXԋ^eCaJ:I(x.hUk+K38& -ec>s nI^g{9YUIcuBeA))FCcE1XA,~R1!#FnO`b)=8@3=uV`Q|RbyccĜd %";Ux,;2?_mXSۡן6V6Xu[r*\-{~x**e8, 8N.#qaJuc` .)GM`)C -Fg!rgB:8IJ%)xvT{oO~c׳u̡18F)[2%iUk@DAQ߃\f &9V$]lVsD I1>AW!o\n9JJr:(,r(q,R0K\IcnqJ`J9|Ds;Q~WBQ۲uF]#l`ϗ 8zF,Vྙ\0Įm;dmb>U"Z𱶊 ʢ yLaN+ { Sg6yò4~cOvP#ݞ˔Nhuv!LI{iLX"()(C:XV-D]gU$v ~??ȺUg̨nCEABAuR=l*P!ZRYYnHG~8&Bks n33(_7oA3c"DݱԻBHIFB,)"5,!˧T5 `/-#\v"K@&eIaC}#;"3wOKpt̹PXZ"XETB| 66[vSe4ڏx2,$"Gqosl |r]NoYqFSqLQb3sKj Pgs쬨.n$ҽp a?mePf[1#Nvrq1㐎NH3$Ȍy ~mTI5JN_oisԇ"ú2̺`،_&ޯu"^UΝuwZ#WH ]{w.^ڂ<"Mb1GMs D%QG8d<]%AM`fMƸ:f6ǃ!Sבb,,O=d"pmkU_k2]gz JCEp^\U9qH>B G޼^ו_r!HTWFܙKuaLethp$+N߮ QU \^rA *aA6TX>n^ #{ZueQ|{LoL IP5zE aFs'<#)=`:Zp<#NL#OB&΀-yN.J soedOfXdhMS@LYAgO׵v#TG:b>f,K#>Jx s?1g ZHOrqn>q=. "PIkTD`ø255$LHmpTY5194>MFugGz Xf]teXv%@V0%ݢ=tf ]~gzڧ>?SS<#ϰ5ֈhG"@*m!VeXI[:;Cm0Hb9veM4%=Fն̴F:K0N tVpN-2,3XBNuaAQȴ54]][#Ub>ȰnMOOtVt~l&"'%R-UYw!&(BSgv Kb mM+[*CA @"Z,O/9# QBg)i{N_YȄ`J6sFp/LU 2+Ko$$D j : tW0,pLKX Kg9yw=Vה aHK0!}b@Sa>H]MMM6lC&I #J=13RZKM4OEzxjT["tYGmg$ym#uiJUk]A_ϖVQ#Y,kQ`}[t H!g)0>-^-Hw`^Y=7Ϟxv;,Ĥ>TmHCO!|$THD,DK+Cmv٧vŏOlGSΫ(\>NYY`bQOx91 qWf cup@~'g)CۦeӢN3pVcܼ`Q{̣i{ cIj׀/Gy º^YHkаAk[ʰ1sgzpM|9^.vd}{sd-Jg mŬ܎*rù۟_cS:yY$I@vnC6v^xbeّ.mSz}ˇٛe܂,+Uk8N\@JDXX+(dռĂif|*uTT=^ `$:" eE&HT8M #UCc"bLz=4" :'Yfv*0nmy\o874+(RZڼ0k]h "XHǁoܐ_ӥ̙kε1!ξ~ݎNX0XBUHAQQrhk +DЈ@ 3Uan+VN+a|0[,yH>@ٸ'KqQ[`zƞMW^c* 5mIW5uc-8Q0^ }cVDt ( ] 1,Y%Fbs!!chcRPu~p"mL r,+lGC[ n^^xg9;1}Pl[52cLm;g8 dSa-q RX=ɜ;=Frq@cm+i ] t ً^*P1ֆ3WVPF rB"|ܢst>ڝQgι*IמKC~cȢs2<&)@m#.N Uk2">?9WίYAVPE"}Rw*OoPd7QBʭV"z%DADYY@ X6sc~jaH,93OqSQRbS@S5d>>)K׏А4+B5$ik 3)s"~Lme#TBii<#1jcH'ǃSkUc?$\><J,K qDjdl3#]^r2W, qŨm~N[7EY}WDtrE{"BH CYU^*M&Akm@ؗ+SWebttNG6/KA!NGI;|AĔ9bM,izCuۥ⧷cʍ&C" "x[(7w鈐},!NUqRZ$?lV$zneߎ*hfz){,-bxOG*Hn4qw_4V5559h`הr}Kqkwf73F)|zC'NvE#A x Gv-3;ou;UNU_^3@5mrmYftcB/Z8]Fk*1DOdCTjTwSZck`( >!9y^V(jA+,Wؙ >Р20뫻 UclAwIΞH[5}2s|Þx>e!4;^,)x5ύ]i0Kے-b{)!r+#k,Yu#5(@N΋`]Sd¥eHz<Zz!]凜 ĺ.(FIIA7Eݿ~+CuLas`cS"ULiNaek*/EFNQGyz0!HL)7/~LTTUWҙ[t6߯ho$<#fUE&k4Xϖ7-2=l "[9tD] ^jIrr $ΐcwrecѱ"0ktz0hb T6o?AҺm\[Nc<ED|<Z%{pr0a&Q|-x0B#+ĥ`lW~.+jS>j/=ƐA?9ô_~F}-)3qے–"xe-_JN2sfc%"~|_EO@gF(>Oɧ֤5۷ RRu~͗L@v*Y?S> bJ`N t >۟+6>1զifF?Mdm?Q!%Cx.!FY-~i!گ13#*'um˷GP"J KlrHcL Ӷs8mUm3Ø}U%eչO%J=uNc8t.cɍp`CK>+^;d]{.Ef52xo! ""{LdªjY&gBK~}_[ܒu3\߷Kwnߋ61:5&x0IuAO l B8ZKP8`Z8HI=X H^NnG\dc@,sdt9%efN${(kWvc`> }$YN,̶. ^F& fYBm9I[&kpd~t:"zFbUԥQm9b&}{}BC 1A"}3I~N` XGuydH&~JYi!º13T%޷儰m4]A\0 A!d$Tmc!OIIoSX^[G".cj55%3밽=7)xۈ) "` gBڇD@X)vy*=$hנӘNǝf,ee!$11Cmc"ÂY:D0S^ 1#f<)܁>F7xy-T08qJxKb@pps2AI4#Pv~ E|4^Tv }ɴf>~$)81kR^R9J +YCV{Y7nKKn O \kj'"]CؐcR|֋^)YtcI^ E]AaS$z=N~ 磳 /g|>&@Џ.ߊw:(zsר o/>=?\,#4.r<珛kv{DA-;+|{_S~ E(McE'7V"ph}eCRf _ XfkaK~z:G*o Q戠(L14?"&ͱޯ6/h?CҔv`LK ~mI"-ܩ.}oF Ds>?}A /wZB0}e$ bU=_2Uט͌>#qu05f QPQ>k)9) )k7Ӕ9q0Ϩ60H䷗ljؕROS<¹ {x %,12bc/YZV^X C{naS8k9zzk 7{*d8Gv0,!PWeM>1j`ftjIml2Z^pĎ9gt6 >N < wV΁NO|cCzՂS]ƪ`Cc*]>KྠLJ}BAbr9aXlk{.%<{j2dHD^% 軖sH7tP ~#yH쥍J"  ymeb׌97q7ڛ4Eh"9Ee  gLpvLrWYq 3 ǂLKd=?u ;e;eO2E;:q2RHYƉ`fV_3Fš9sH4 wGMfADޓ)169WӨz\Q!xt)jC{J )F f#C9Qnm"H)Kfm=B^, \qSwr㸤 CX\jZ,qQw~1_w):G3Y<$2fwE7Vu)EBNaUi#3q *Yp]SD$St˕b( Ť(*RlY XVwt&{5T,2<_*dAm,r bI lj!/v.!"C"::5%\ImG̺?)kRV0k ;I)%:yX_jx8":FWƨrc~ѥGU7;fB0{ص¹hKWRg|ܺD!P* -N*6֬-GkUky G$JhGPѓ  2spEѼ|׉h'r[,2I~5/s_6p6Γ[Xc":Sed#.^DބG@$D6~MZ+ Wm+̚Ƈk*xJm¬RYΑ?gem)UG! Njںam7pUҚdc2}#bBgF%  @RPSP?1s{q:I5כ>&2^3o; yp!{yv(yիoYcbUpl v1 !̓r!CitU,:c)<{Jv _o5lј(:Z͡J1>E>/f S7GU=Yfsԡ8O&ڵ nwguɚ${\_+{Vl>%-5u'v:2 )Giu_YYxgbȚ.=\-C:.7Ь*w'=̓Y۩iY)2dJqsO#Q)$Nm3n78:vsOBj nyb6]E&)UE'#2_^O8b1l1q?H2AюCHR0꛽VO'$f~f;i;[ ^l!rJu }'8 OHym"뇘"xBJnKoWVJj:>gy݁w 9q-[9;E1s)ҊqDt>%? -88X\JFռө(I w+αM?}-<˄_Խm`I0uw޺Dawso_^tpDHP`&8 #]>V)Y(j^_#ے_/c+KE2X@ׅ^iFA!6= {e,pv|שyJ d}kolLJkbKnw=!ط~#O>.Np B&8%&t垔UO+XRZ7?4b Ee!OަL ئ:'D0+N/1~^ˏ4KŜMB5۟#0-q~D>O׋:s>ac-mzOR4RHm+7kE?^_5cx~[ˈ xW%?v 9r?%ON>.@Q!*fcgM\9UrNŗgoaawG ǧ߿dL~T,+4zDm'`fMBIA fASZ>ιkd`U-7Sf\)@1%ttLC_~{8yJEխi _O+one)3&%d 5Ľ*)]4rD$`U Lv"Nnys`ir"/s"@WꗴAu-}H˚pxu `BB?EY @H"9AQ9ļZl=O!hJ὏:)%!9o';MV X,Nv{DkT| L/[}} 8Rm3-^nwS%@~xd|+XUbc:GP#e- r}RsQ@0n庄"%Ĕ8 78>\"5q}J؆o<`e!W8ԍbMwwsaZĸ& U\)6#5 )jqYҼ-4h=d,u/0d4NQiszG:cOAD0kp6Hɳ\4vϗNjc5o6kL)1ĢLBUrg#ln')lvE5xO)2e&8/j )XQy9v5$hѲD@+1ZN{FJ8y9[l_Y_CGYhDԚALpfY[ AgNڽ$㒚F@;yC^L8xDlZ:[9Bz<cP|bẅ~^_^jgNŘjcwl4P"_gg1+1kWx{oM gM$@E)$\xbH>bdr+?lwb;16){c}(*1OAIW~߽*D g2Eert.4[qm#7tOQ ?qb\J~UU%.7ƴ DyqM?o~{ag5"lx}+8ijU^'9 9K"E)_@If9'i ps 9 4^U!1whwȐt^&dY]ᔽ}: *[F"2I_G Z'N5 ~69%\H6 ! "gS"xQɯX`%_Vr.l#,D]]DkT|D\46m-Լ;vjYPJ!sS>W6R*~~J d7qάR2Ƒ"okYWg8]UPd;aPDY(D1$kYC׈} m-QÝ'דZ8؉ªVB=1cҭuwW…Ŧϫoovw8ǔf]9jyJ T U?<puˤb4ئ1d6"zE%bHR1p]2Z2$HECH%zL_ͽ;pwZKa9&L>H(jVl}m*l[9QIoOD`֘fϻ WPZEj4٫%lԴj &7UmeU&[9|J4{i׸yux)QHV5quYڽ6KX?mmMKК!R洿;-bâYη!!"\r2Qr}< \?APD9xG.n>%Ьq}]a u)@UM˘lT dX:n:{.I2H@9mV0ݜbCDN1?Na^cS л,q_em#_** ^'w:;BUcJݫn!@p2/s92_3rp:>fSӿV~YĹزvlQӟoV(׍`WkiNo͋Litny|o!>쎹wq雾Dxx:Q_.mDL)k/01%JE1ԴOo66ZwZkk4ҳQb׈a}97-tFjce-)]^*!8 CXr@&Xe;2'u;~-ey-K)qk3/4hcY`Byh{h|bۣ|C'#0+ƲRdDQuu%p|CH!x%kIgXbI>V~wRY'UW/Lf3@ Yͣ >s[YLJUE.J>n6ϰ.%"}4zLkN?Ͷ,bj?BQ04xSwT9#d \"%X9ǽߝO47k8vr|Ӫ#S %X)hj1Mk>ΩPj>-KQ"X5 !8L^1/|tb"Z\h;(Sph֔(%RJ[k^T JmrL˔g2b;]HJaB2@> ۩Dpy_O{<Ս<_*lx8Hsk,3>uM@ 4&zљxD)IV,e&8c;R0~qsRO9" GDVJ6YhP۴ξyT7bYSDpyZ % .5T%*i^S^ ɳ\7>g ч6L)6!pE˚IYƅy=J.Wyy@`ĐhFM#b S)Ey֦B0u>RLJ}M%f'gST ?SB`.>O)ypQJ6)d0Bl'III ߨ0_Ms1ļ1&aˡ7/k;:S" q#l1dOVH]]>ߴ)fM؟^?5>EX˚8x|Mњ ! ͚e; T㚄੭y}0ƄTt{ko{lHӒ\?_JWٶ z3tz\ V@×j ]% cBil{|)DdmJ :㈠s&c04=$+x8cߞJcdEew3lDy 2 kSϮnD矶=[0<2'YMt&~"Rr}V`ӉaNpζW%EL\w"ćдbOK`կˈ- e^g+EgKCd{g/zw\{sxUfuEɂO 3k, JqxR1ү}9tᤝKw<_rYc? ~rwm-f%sn#a۩7ɷy~Eϕo+"f&Y|]bQ*kY[MDaO"vwP?MYgBONH1ҾftFN6Ufif$a٢` skRH^TJ޼j8M϶WNDoo8M1gB.zsCY!~ .-<Cuͣ"k|?FHN ڬwŔaOG1l)w˾lXѯ{yY?ezkJ ¬(X!p~>.o=~\,ۍr.HE-D _TJ*-6-rއ΄ '(/2y3`.@ݨfm Ԕ<,?{u[JbFKrAI+1`M$6fܻ!奠D)5%@$vqw1;_#$89O>"!Ęjmwu|]z'>H)bq4%0;$i5& ΁3Gpk ,zev@ymv9e{.`D`MȊ;Ι)l8.,1&7 fMNY36R*üڝdsZW f|=/c(jQ9(IE?϶j7,ԴDoB.iJ"zS>=̮U왮)y)n,xD!݇$OIŷriy)oKr3SjMo i×l:L_cJ7uVJ IDAT?/:wqz09N}9V`9LwRklmVɭBSBHфzx5J`eYCQR*uG莿{Umu&yCMMEq8Ë 7bcR7!dĐ_:ʎ{+55K w JY{ㆇ9(w\vqN_?]^(kBQbV@ 2N'*Vjf)?ڴ?En;12T3YENݿ_Y=Bچ:1ԇz'ΗWS|ʧObHgjf~E?vb]PTr(F7`Ά]67eyMNSLe BbUro0z :y;\)ͼ'asY؏q?\t;;֖:A|9`5댯kp3VD<ưα'}Zs8)& /e Cl:)5zXKyN߲˛kvj=Oq\Đje^/N)z}TX&5 n. !OjCS \` ,/ ~Ck$kf-_?Bi9[۫#װ>ot!9cHwl-c;j睫Zդ{g|ݗz{D7MCB0ɿ5<"PTb{cL@JQt-є5 cJߌX"Nҳxbo(!5]l<1Gx; RŦS`9'XQqpJ`GR2<!qCP9sj:ue˘yI l7+BBg6H8&˥3 ]cd{_pyere9(fa}nxV~Y84D,jr>1䜂 B2!~!Iu#f!]2GDVjYRHȐs V_?]dΤeNV0ڰe!3B 'K39?֗eL(sZ#r mzO?4hMq1YKB2z` %!ٖybQtE0ńZ50e_/!/4&ƀ (J.r.OW'ҙ cc?PAYOB}Ȫl_3gY̰4ÉYY(J["/j !p7A*a;*!5ŘFݕ[tU*S`@BI l|bH|]5,S! љPKzc ڢO'_gefZ[ ɪFKůjy2j3"n6G2J¼ĺm#_Nj׼B!p :1t')x`p3ș0nΰjҐ|xqw|]02G3C^o1L.v{;q*J?" xye-S@:[>/tT8abe2H .WWZ͋nl{fvֆSQLs$&Ά7ǃR ~!)Agjk~JMsYRJEAı7Npxy/>|I@BJsk" 띺~>,I]?]QeBVM&w.& Mo :TfYV(x]`iNA";^mue VK`ߟVp/I1"2K@gwGvl"Eg=% F)2îS'w4%zu!DZH-SNej; 4OfӐ)9 cT3i]vEbO'<Q3(!e`Wҙ&LDT2Z PLJnKĪ6ʚyYEa']>VbL)dE-(4܍.(wx\=t/JmS; XVO1RipH9f=dԹx\]J3RTS`E7RH>@LE,'lF2Yƹ`#ÍYOm+?/_䴤MoNb)RReW2y;J O N3V.ӐRhM!%S s-5K鉱OCsT7%L~;ۺ z23BHNqW*ŔMaWG) %u&cLdN `PW587R93$VҚB@κË15O?w> 2)VO/ch5+_m0ܖ^xSoʚot !4<c(Ќ~^'Rzyݾ/*K1Z 9Ov{6ʿչRE@bR27l[փ"b[MfVk]X 0FB?weٌ."x+|LeeZk_|.ƍƃaZ.zT"% ffo{ E M .zCgZ >.p~ -sͩ ҜS~ND?^a2󍝇`ڎOY[Uc⍄* Mvi֚Ou<ͯ-:eս;]6ϵ&*/ "tai^Ѹ4̗g[r3"0 J0&l-=J\ΜZ l7؜9EZkRj{H=Q-}2oID^y|ϻ)e+*8-",u]fm5<{fYےOvwc_$kEk9hw!Џ-ʕ}gL^5x8n|8G,˽UUDXzSBST˥p*w/],2WC%|n2ׂO+pmSwoОU5k{Ddn.^/ǧZvbaښ{{xosj|8[eߢux}/%0c[ӏxH?_|ȄO|<:Qx+=BD׵M[uZK*XZKfGMv;4|~ TD(@\KS殷`2mE/YR8[(/<r8z~u։Z!rʸv_S|sk|>Rds(:on-Uי] 3p4vZYKV}sVky`e~$Z\+tYʬRzÚz3)7_q/t}ߦIEswPkN8_UB'əo<|OO$/bj,hb4ik~vtK4 X YG%nU~Z%i  ZC{|ݺ1z#j.j& wsz-z_aHjZ)7]\U\5.ĝJ7|T;hst2zP-UimR+`kOO1'6)-9m)ǃy{q۹_4.)V#!#ْ̭Zd:[۶FLEQE{1TPl$v]̈́>bے5xw^oj՜x%lUX%>ܯƻy/T4M.VoN+ N f|/:c-tY|zvy)5@ sGjoXu;2Nv疙,oB)|~;6E߶٤C&h(oR!2"Z|M))HnO?/'K[3B8;NGZY~Lz_ Y [۝E|rmzL@{x(uIOe:v_Kcog[k&ǿ߆Ve:mK=NVU]0%-3'R^Ch^vEs]=4йmV|Or:ߍ6_0v+}D7}TiU9ìU 49x۞[_!!\RP%8<"̱#簬99L bUp؎O6\ Gu}ox6;QlV@Tw;qU9qw&V㽄\r]9`80߶DZ+yTo/NTKnΛ`Y9xqTsBH0V,#Z̥23TgܙYOώ?^ ;M,sf"&H,z5>DV|V2#9n'Դ{v EVu[Zi*#u `}@Yu #B,;0Z0v[v~ 1k<(:0?^t`lEJcwׇui12BcDCg{Bq}>i krR zosΪ`T{6X v:3@r~rj GΕyoul]B**jmM9\=Va0Skb @UG7S|FNy>"!Q?8cGXo8;l*rxgraֶ?t޻uRw!H\3:Gn{~qwQamN/B̥@#֑5XR۶z.ֵ eӸ.%oUDGW,]ӕt~EG[ 0Q{o[rjͩX"M@ºawRZ/ &oN*ߤ+k.~2#P*dmxy\4w˜򒞞}kH+ѱ&O~=J}]gos[W>JSr͋9]ZN=SLIw]mMsτh?Է)NמY G 1DzyM趥 ے0CܚӒ\+ev ?/HFEy.FA|}oUH[:~[k%?0󁑖ė:T_@M?r7vwAiZZw>z2՜}seZbVn9_rNy/۵;G#NóKU^^r)| OM|۞6eN ^X`;,zψ0)yTZl?uk3vdYs5t䍥]nҒ}t;@r)yo%k%h 2ySmܨk`bT4c9M5Aqޔ\@; єT-JR+ۋK[ZwRTtB-@KnẐ;uk]xM_^)^.uG~c5R8GR\ )";Û㐶8{UI+10:fٖv)Cp)b-=93|6ʊN]kͩhTEXdž]>~4iS=M|k%t;|_p "q{G "*AGV5|<^K [߻]Y B#Go=>r7{?9_Vpr`Vq۔yY]/5 ݣG_K)Ma'JԪҧ3O2MJV6:o׺G뼽,{ uǏ|8 e=lRn[۞h `v@uo|0[mBHfwHICt_]?2)!9o/\9x3~YʚWRy:VznZ]eMq:ҝDUV aHU|뵁j q " =I|~4쾌D|+?[{~~T~->G]Eؗk:¶m,HָN[ոGhE|%ƐC Բ13hVE"ցfwYɀ )+֍R)2Ks|&G0'iji4o bxkM K*D6E$g8@{M t:ZCypZVQ+ƒ$-sN{M@%v!e}y;gg=*bI9o f7P ӣkvFc4PֵTE5]֠=`[|NGķ<1,*을`.wAu-"P|8wuL6&ܺND};-5vXZnkrn[ǴdGZvD$׷,-w6e_VJMrW[4 ,~||"ܯU>>2HFZXSR}zr9aa]S{+z>?w\ؽkg@x Z=!;/l,/Q!c 4`Z쭵,5wRep8mN܄,c(P`nhη!!@?2ۘdABP*烽\r.D}K; LZdg덊 Ry{~Jy+!]I-emsnMӲN#hGu33kBiDѲ> S7ɺ$C:<-iG ]ߗ~ e笪oxGƪ6QsVk|pxȇS0riǧ+!ZZ^s_r8k,!XsqLvXKd{:?vRE".&v\׮3ULܶ6$ؓ=wJj-u8DTKy1>tMyo_nZ[kf% hOge.ѧ& OevOfB@ZZ30pKs!p  v97P 3 u;3_7k1.2ҏ@+`LavK<o}:}31}~aUcBluѵڄr!{wBԄI$BmYg׭qY LصDh,muZKS%m8ۼ縧 z'ĝ ݖi!~Usı%i?ůy]Dׅu3S}H0~Y2ƑG:s7 {ï~k^:V,8@,%s)3aM^o߇=B>GhC[i6ah$sG=@ODTu.]]}yzRɐ-p/U1reL|:{?^<췽u7?iZ.˷m!XST7"`c~a^[컺2Uu_7( u0K:tx"^pR#MDGmNy@meVֺ2sVTAc<%MKܝ-y֥B̌az_gIn|:y[ΰSۛSV8v{-lMo {$,= TR"S[ G-kD%!, TZco ʬ>t<Z`T^!((s5Oa(~%*KzO m>6n ֻn!nIL@2EEC斛z]mcCL? >~ܟ ^PZqkv%G'FpRTjZG97ι&&ݓ5ӵi3@O+# .tcߡ_`m5qh0}]ug4(EAϸGUG_ MIE1,eI~YR dL61[\0\ mh.x罨ZK{`mfT 2cEFSlEu+XCVjiiHhb:`/;aM[C(%ہ[mz*.ᶮҲ09$Bhq]/ *e{-Ą(@kyeo[ͅ*# slߍXԭkEoIuvYk?ܒd\"b,oPr;emѨT H TքtSGt!E@)KBPg49n%v^PB* -3wZR1p㰟nov.Xűbﳊ-ZaζRӖ|[$TֲԖX% 4+9YO?mYɪ5[fȏ^UӺ2PO{#w009kwsk:svUcz͠ǧ%G[+/Y!~>s`WTD4@pѕ;#[9@fCg?VXE$jG쥡ڠ؈sÙgVv__&==wQi\_G'Pȵњܚ6oM^hL1:Fkr%e"m[͙[w;LTr{4ʚc*V!omvQx&r6q3 LيmdyC[I)Y[&a.q06~$.`;%us^TZ$"W.K:/spY*alsUUstΊ޽AbɲƬ]Rcy+""&i7u-I[Ϭ zKԕh}I]E 2y=,ZU-@vO{M]qm90YM^3(QEji6v [ $,.-ԩv߼C"FDaV 9G[2*y0'PHFCTe*j 򒌳d2Y󫻌敹Ӻvώ>|\e mZt3dHZCn}ot+Czs]*[9m6~Vfl0W@z_^^%T돍m+ N޷<;k[u.aucZ2j;=uNUc,6 ]4֬<~ucl8Ssqa(sg,32>n2|5ldacr'#ڶ["au5Πjs;c  ^U9ioi8 %|s{CԘQQUńmXoVT%&HPf!Fv)giP2NgkXH&Ro%CyK-. @'GӺa@ bq4eT] "4"[fCȢ6]SU͏ JlO$|0=ʷġ$r):hDe_ɾB5H:KsL|=BZ]Glx(JfK:L57ǁxAu~;:/?w,8YG֣q909ͺgH08uu)ڦⲱ Nk9B- fmnߟn͹d!4[8.uizZ_bKM6֦\ok0$R7N2'/we gY푓* j29=!bݥv-%w]3zn,d C,yv1 }ܯv4P@~= b+Bt| gc">>F-h'q k. *OFO@NEm8yM ֙@[q{XeE k|hݤ }=_vMN]]%u&s@ʾ$UD*Dct쟠4&cȘV%۸Oco >mMGa**yیnr*紅ٖ%hw[ך^>R"&tO1`yg[_oA !AY9߸G댪\KNb}}dk<"(CQu!8P'^& iUBoh\[&liz8ݣOkB/~pVmIB:X&HdHE`mk.{|0kc^g'!]T}gYԇ|4cܗ.zEsWqcP,"Pk&S ]ǕmM4 QͥIg`J2z e~˽JCU5D4ͫ?~(d(~#H 0< .| z/"pIcBBoKϭxu5Vmj3rc֝_n&TVRAJc "pUS-q>Rrh7ƚK2ZhlUPI4ا e%XgC퍇iMU(+pkmcMޅXoT." ܴn@Dh8Jv~"U1-1Wc\;U~^\"s+qBcIX5m6=h[byWRyq N KPnDH@n5)/cߒMJ~4=ӦV ~п:|Ԭ7dHDZn3Y CKm\ce3m9Z)+pwXE2cbɵ@O6V,EHkVL$6hG.LڰYH#y1zv>}6&C5|k-7h$k#C.GU[8Vl֖m0P6hXu ͛0 GBD_ oQ)_nhUZrRxɲqZI V2|s*Na߸%FĚ "cuSKUV`FDUmqc띋@u?.HIԑvC4zؠjyݬw8%kcQu>fpsf 3TUd[[xeVUw{?` a6#%d,$, 2H6ötUVV>Gj޽wȈַ%}*zǟ^RN*zdn΅`i2o.>8{29Fkt;1Kz[{47XBvww(K?v'r}+!^*v Jmsذ`e$,}HpF="<0Zە}{T|lsR*5|>/+OqCOxQ\#\祔k22)#QTWV5WK-yĪ>IsOtwo3Uv[Zj*=_jq9eL("zl^%={"ucgLu]\m>&gg IDATSeSyvA ky|`ft3|2Sj}#@ʐ㭣!, }:b$LHdf'Km[폞;VhOL|Z c<%]8e,-<I$9ѹQYSHlږ .\T眄"2ҊNyM:lm]TxkcO\[PZZ.3{Ţˣ} Nu!s䔏߽3`z[Z @H51~iz҈NSq$lDsNqK8S-z?v@Ʌ(;P.n(GFd™K+2bnxk)5 {)}_㱃:wG)^k=&\萔 qJq.*?~hH)n8 +%tR$D<$?|}dcV1Te~"pT^^!u>( 2)OS/r|sqfnLit9~[&JY?{E],\.0z794 o}:)ɧȴ2^[g}5iDuΑafطT R# S}Gx/WRg=?-~<돋~.?1t<.ݑh7F9m~Ӳ,G.5xlx^zvt8""SM77T@d+KOS.1e~IeօV𒗓}W>MSyXKݩgtIku7p&"N!qc׷#4Xe frݽz7Uuw""&JL"U}lQMJJKJ؏X 2Hf o|!9/rp9u&j Ι'?xz!NQy(bJ%񢶤e^9Ez kŗZ>)sOVb?o/m";" VDzQ8(a^2g\SNQTswf;jQ.ulȩ">{JO/_ݬK, sJ:Lʜ̬}vnZY$z!>?^Ӄ=y\~ݿ hNY:(5Rc3ZvHTk[J%Xhjj)aS=R, W C\ss[?~阩3#x =l^u̘H9[圷X"ۋdf9 Y/6t˟dL~^з|0ɯG@F:}1ͲܨŦR~R n .MeJ. n맫 60s}hOoS-8"Ceers?Ũ*&\DlsN5. gޖ{?vc)SRSS&)5c EwBpa&8j O`j~>1fe@]{*DaZus3DS+\?B,\EdN͖q{T2c13b>]1r{:1լ*~ CNSQ1+pTO#%z3G}5SmCD".y^kD)sZ8Vݠ#,cPֺrE+uiDUǾ/k:daCEu%{cS6<~ USJjj8ZȘ^Jc{'r|9p\y}mcs+?GRM?2F_.[Y1kB>OWW760e_.w߾R^TԘ]}C_?~ݶ~>z9ޏ˵ޖ>x~Rʵ>~\n2g_'?D*+"Sv XSWw"Z/WDcl\Aሽ蟞tq!j5~y)[+i0)u9/2dC'?1)q}zWǶ?nffz zq 먭Z8Oz<u r޾\:oiΝ._d헭,e)]}Hؖe˺pNfۿJ'98~!+,}%n5}GU#@NNIj-~7D}}K~\1ugZܬ=Zgr"~Ykc9[>R*~Ṫet#m>\Z;6f)Tс\T%@g{c"BΙ3KU9K9 q F8OW^\a9&G¹\MUݐʗU| qzĄoc r>bJ9N[%9H'of~_)2Sqmvs+\2MܿwT.Oh~Sʹ}{kM.~{K@x;.z;>lNѝ2qfƜDdK)BDED-"2niMu~Ei1ˏ}ZE泛A:,˾?o.f^8'? :s+2F]7s"ܷt*1-Y"~Kk%9ZcoΙʉ}/ֺ_2r1;p6FZ9T%ғZK[+9=2ǜ2(ʜXjJi\}R R=f[Dm? w'7 ,Wf /_]DS á{[v 1oȜ7pȭ%yQks3hjX rJ2q즊,~9].WwpDD{9RR /K:/_"=^~}˹ݶױrAذZqs;LM`RE-S~ykQ#"c?zSb7=la2ZkDxdf暇LFUࡍeBVRL3/ǿAUy4T ?WP㚹񶵶Ki&/s",FT\.{j^죿=(1=|$\J)>Gj%}tiwFpcJUΉqk 未\rsiN%ifV9!CZ-ۑSV.9vkmKwS47bWT--<\HhKx>@B3+mYHE±ǦS2#Na\l=RRiYr&28错SJa3- a]FH 9ڊ9=g&bbĴ,Mp8.`LV<_rsLNIT.?0 G{+)NL)9`Z3@}EDz,wLDL>9yYXU3#Q~B뺎 $RsV7{ Ŀ7W0z e|yi!qR~1 1[m+DO)|/˘Yml"sqŃ))eQQP0,0pLdYiբn,C~ev@98ȐADS%A([%NxCd|@* qtm TA~[d0us'}_oW3#f&6Ո_1yf 뺾臹\Zg*[i]>ژBe6aʢ#sA$f~<f8@o3 M$""8Kbjm'TUTeY}[["sDX9?XiPbZD n^Zmmqس^)At3NiޖG: q@m5lF!qc X5$*s\dNpx Jifv@U멗+,4DLbsYYJ\JAq3QA $b1p 撛zy919^[Gie)RT]!Z5T0eiQZVJ]J.i 9a9V7M!9]E猝eYcG BrehwC"%˲:pug&$Q!9 "NmseY]T̏`c8}ts, 廜sk#Ȝ,&RULQ S,DF'2JלR6D4G~!3G7>f# 7S318-hmSyl8\dAnK)>Z[‰MՍT sN7M%RJ0@щGߘIsʢq1D5JKB%@V~[h w/eW8-"PUEtr< >;"#>o若9e)*Gݝ)\-$.SVq~lƩZRbĔ~r۶կc{0eB|K23SK)?ۧ}\o3HG_[.n:f_eve{d.E,KR~3s.˚rHݍޏݭF̽~jYVhDZG6ʿ/6-V}k ?ȹ z}_}ZkcH,"{ﻚ0%Do,qAJzoy#&F9'8jw^Rs_/fG?~]wfJ"`9{*GD&kkct)%sgVsx': =s>sQDyqeYBRf@wCu]HU,}?ԭZkc{\FĜSgPJXlsF(r~Z c2ӯ&èXٶmK.QKw+eqIH#@933Om}3s^.x&eYf)K,szQF>4D'JT)%R"zi}.{]U[[#̨1Z4YcH+F=z,d5 nm5rzE)#*qm")0J{TkTNѳi9D>.C),2?3iד9ǐpp`TʜL82EcYV":GTD2Z8I])9pRxD龃K)=R]1bbQqm3@DpBP"SM9?ޱND99()Z[߹NLN$/ IDATBc!se!1;R8挀jzy^rWUG1{[*!s3ruD*>t|e̜j0⛃-x 3!SSZ"q)z=ajxP"U35! $9.T+tqM\@C%3˹ [[D8QM1NUb313s\"ܾrĥ"3€Jce ~̥J_%xsN9x)}?Bٙ@3} Xj 3աPhxtfq $ Yi8_, `бHj뺤"z[YI9F5b?v9qdeǨelB}TE~9L&F}. 4|7 93>RKV(1#"'Z{6b!Q1^=qEs3Ӡ{q+$N :sfQ=9%$9!QIjka{TmmRO6rg$_q.õREHzzB^/+GJk)]MjkfSڏ>H0Z/s^jA*ef~^=8Ÿ("*n1)h~)8kJ9)\܁)˺HsG>rnͼ1NtB)gS+>Iti) #RĔJp~>}>z\R.W#NΎTEzѻAm/3ݠtϩӣj9-" 3wzA:vQɔ+N'oT5vVSN)ZU$zAn"{ <-/f+"G,)!fb:(s92#t H|r=Qrǿɯ-erHDԅ8L3唉h"v7UQT Peb3?C57p&,W"sΞr9K],R?v".%G&"s G $A '"wb9^~*#'DF$c5#s9-kn*+ ׊)!P\rr8NnOyXptlsOyTҏUv"N 䙿:gHo21?uoPcY;v$LQCWM%3H/Bdq2MKmQvι@ȯ#9lH( y,5`p?FF 2NG?vYix'STPs2'0sVi ΟUEl1ԾJQ EVc{_1)($%=)!ŵ>Ĝt".mADSQ9q6sk2fys2 'w}K%G186=:R5dB <{kW30LK^ mȔP^9;g~j1[Y)Orkm3#"Tî=gDK-*3SX@ H沬+fZk-LR؀`D |:hh2&s w"q=~^4TwwS$r>ff2"019:BR/!z"cCĜjЕ^}{OT$#"f̌@ρ\p7"vs9{bAАj,&KDE㛙4Jx̃3}f^J\sn|9ItCN|!XG$Øe|7mض>圫C4C|L⣖TR31wNIE"xN'dR,ʘvs+=%H .:11?Pg8i\t0&inL5/=SQqwDXu8︚霳D ?`H)>GtI@ÞSBL1SHUgJ%q ^ZD7\Lt "e.%@HSzJ̴=זs6sH@up<Լ($8gO1N80Qrsŀ cR?)Ajnb'*:۠DG *S{]$s\CD!aMK[_<'mâ@/xM^\'xsOFİSYoΰ)N!c3ɹF힞 bT0ΜK^DƐ##BLtpNϸSRrDǐn%Xn0Q\`k0DiHG3Bv|Pw,1Dܕ$) DMUDǹ[IX8EWcJCZv\IkqΉVTQňY !¿!b"a1Ԧa a7I[c.X(<(DZ 6ГSо6ہ;vTiZ `nu^I[zV3:wkeaa1pnynjk҆!,K\"X1"{k; ~/A,2|PPFHڄ<|]DQ=w+$14׬/jj) 'xLeİqWZqCODZM1:ktG⇬RY[{v\3 a=L\Ʉ۬L,B9/a#E A@v~VD{dh[u6".W oҐj^T~D_ῒKK"请3s#GsDk,m2Q@W4n}kRqhɼ#6;z)˰rӦ{ÃmB$E\pij8"tG\S^6s%}n/_0;8 ޛn}Ils2Î_r!^ ?l'a^A;UƎf޽vt_ofXbg!,M/杈@0GgvA*$nwaE8}#ʎ C 'xz۬_Ú:܇`f#0[IT۰vi闿]~yD=L^=Q"[EnN OCj25HFg=$l*"865kJ>bdE Z&"dd3%vԭB7DcE8G򍰌q 0m*4S'"|I "xo+{}Aޮ=<8> AQN2{!R"TJw^$[ۡb306&NaC;2QiJ*mx%wWi@aVZhm:^lYř:ϛ00Zfiڈ!ޤydyDy+6kWذ;L t\8Z"d Z@Y7U2Xk nޕ[}ē[K{7M>E,J=t߷7ذۡҚ!+Ew.,* AfvHQ]wsMZ;`(w# ~`903lHa~` 2 f|qܮ}ᝂZۅ;"%emV6Q7g}֢3$eM E1]An@:Si}ަv )FwD Vvd<캊*TXF~לUitF(Dlм}ܳnŃk>n۹woMg`?ogLeq]Uv ҌM1IN ,# v&S9=jl6AiTPHB Kt! wIƷS>J+̈Ǹ1.*)YPęRbwͼ##|uCmm#qCn|EZYWـ^Ѿ]7X7{fag[}fd%fԦ{~ޗM.$SH{- pxZ3Ç 'q3"ki X"" lx<Зgd-1qw7Ն7,"2]*y!a!0LՐss8U2s ȒD]];-͍Q};c AͫR6_`HGr>&y|y$ C "vA96Be3|-(;VN"DBR!X#*$ШVْwNn]8*pe, [^@άQLOĤC hw` $m8'ix nʍ>ɃkV;0ux @MU# &Xh ;A-:GĶ%k> ;b*]5@ck2ɐZ)@0̙,TNgY7ݰ棘PNCĞ߽*H_~2ZT`ɹ4󡬢Mͨ…ㅒK o@ Ubf71 3aeg~7MzS624mG`PV6_AX5oߢ1D@vݿepjE~t+|ZӣaR2~L3[}oo傈\0¢4 031u&Ё5vuB}1CfP@BuN ň-(*j É|C$LA1]uODɥR =m+ Ո⹓u6Mn$s 3 'Zh~=EPEQ%9Kn Y A- 6ZSҵ+7x0xN'Њ*ZQh62IXb1гù_+UE7EZfۢ!~.i6Nu"[61 To#.{eR+0>#?dL k^arT*$&w3}>' *a$.Ƅwo~7ip&h]vx*D~n$R1e+$M{`|T~pp(kRsiTk8uC^+u  tdKGoziz5?<ozI*[7Ƣ61U'$}If$ ΟĬ/'1T0i1%Zks:h<nJD}/"kXUV&kBٺTV@w.͈e"">bW1LL/fLd "x]z]ٔ5;D1 x'xc鑱&+ϾLANCDE5sCbZr>A\|FSݬ2@i풄{ʠ56x$֮(=ďr$oDLy(wAN&!&vNfYA}5)3p1v؍mڈV;Y]^7k/[Xج+kR%:y~=i_Q-џy6:Yr`k& uJ6DZr}SE 7"vh7mc@ۜI7 ŒgnfeqS&~Cd_&#W$&#֬5[^7Rtgʷ}X[»9dn3A]1%hf^٩0D_e/iIO\Omfbk΋xbf&`W#cтU9Q܀xPfP80,yz1OQc]\0: LޥL,1#B}k\v.6I1t2Ct%'J(ؗXL=pzs}HIDATF q~MƘyQC^枕"D.4cNo\ |~&TJ%X;EIYl= Tdڐ5i*gj1fs0>oEA~g3( ogn%z:3F$tIENDB`rickshaw-1.4.6/examples/screenshots/y_axis.png000066400000000000000000001101701225123340100215060ustar00rootroot00000000000000PNG  IHDR,t%DOgAMA asRGB cHRMz&u0`:pQ< pHYsod vpAg,tIDATxu|?7.$!H ; 8ݵKBĉzyZ0vggg9s _;;ڡ18A b`3V!e :*BEp30P Őp9<tEW0I ;Le1zA5aD"XuX(^-Zx(ԺPB555Q(iTFbFbF 3(҈ґ̕? TC5-1gP 5Mc{{{naQ'NDp p pl7={ksͱ >w]qeg $HJ2T9L}W^AZa k#Mf"TSWW9UF*OEl>(9"bUpg55%)\ g'XCK^=tR2L$f, $$!b)bJ|5W2f.\jfͦbՊU+V-z{k3fu p p kqA7Lop2S^\~69a^v:1|z\]QzNϱQOڛbżsk9a|y晛g.aaa^v_# @B<)<H}L3[3z}uKT:%Z quh=bX!;(7:lb#EtlPaôgzwݱDmMUCBpG"aUvw#يL^E^6?" )uq]\i"M@=gԈQ#G#1>1>1>J=3h #F%'$z$F4POzt.!âA8PmqWܥ9DAB:}iHC2(t &ڊ+)BB;"T~FMjgw71%T:R(EC!_%(|hH%`F&[unUhriqⷋZ( "J8 EbcH^ܞ1B'Gx.Y\q}"{_y J)84bdLՈ@4TB't$ 6R)VҼcت1.wE$Mb* >ibYQVmA0{!+]_ov("u:0&ZV[&LP ?Oy/!KD 2hR#Fdψ#n7)$1ǴJ2L"P櫢WE{iW'܊HwXn:A'0E-PVJ=*w65At^:rbrQў{n.tw2,@KEj5b$1 B#F> FBHZ(C%3(;.έ[o8,kެ#E,-BQ(#v{u>˃.1v6 TjEC[4iPRĉ r)b>}ZQ~|b 7m~6 $JZf1BQݹ# A@@-4H@ D,ZF9njb-SD3\ʈ,dMch I=HB/ھhyÑuxˢBWlP0I=H")ectoӽNv>BA5 p^6b{FL8iHOS)OEIeHޑGD=;34~bCS>}n=_ r#7:&Nj)b PJe}AyWU( uD澛hdL?nMJٿ\5bèv 88$x\|hO']ԞJh3X 5omsp./z:TO ZGфfGZhm53yJ rެ7ibK^5N$ fƴL,0{m2eIuD4( M0P|XsX4[n9\RK%DN䄅QMj!p0HH?^ iV=u'yY}`mnS\=,smN;Nyy㣮\my2"gV@ 25d3YEQjF\u4۱sNY9N8aУ{v=>7`Cŗd~4r#7,1CTSES4n3NZBT4ڔ~GIj4{%EEhWl~}`LM7\L>m?jó&OVMRw*5yoI}CE)VxR󞼧H\qF[gf g5*@o}X0PvvtE7iȽܲs=W{Nhd/ ЏJ~C9F| ' e*"Q`GK(5~A8IT痩o͡>IDd;7V~PݻGg:F9$8{5edwGc ETE^yg>V8ɸ#|2\%z^b6n+*reJ{=B2ߤ Y`nTGlۿm_|u&MF5ZV2P?ޯe$J9JDH LI=Fy7L#O|7]ٛ("qaRG_=>W}]#{p6l6i4IFQ ,(HD"2}LaNaNaN){ʞZZZ:TvP7eǖ[vl3g܎q;>}l) Rv.\ؙq3nƱqlP`t0U&u|Iraq}wS o L`AnR7UnW^ QD4+*le2Rfz_z蝂럔Mf?od9U&ALa ѫK57-2@\fzPSRx>ӼԼ5zz,2aC]jj(cW~NGP~ej9C9r&gr6jl,KY94P&eRfYYO[>mup]Ȉ#_2ennn1cnj#:(%b=b=b={s4qgU)!"7r٭dm̱}V!OuZU*+Yr;"k r`J@uGeY5)5"YZfl쳱iJrI*-4b󡱌`82L>sϕ<0 Ì24kF)lPZF4陒wͥ ̻Alyՙ:+pVQԤ qw`,`@dӐyXmR@+e<KTvH@TVҞ9brHO''샣Oǭ. `% 1 "~0[O:T :HjumPi@Rr=Cz ؇FP[ZhQQf:QFH_{jO5f40jL1R.'5%G%T{Z^ BTR~7--t"KK)w9O֑CW\~hろ |P2%S8*$Me| í;R)3?gzH#k2yL<U Y <{9]t-6-- 8Hq”WeT;0lEL` -8ĞI-Wms[wa}\,d Wx+}6ȧ=HL1[lbzmږ:(hPP1dlTA514Ѓ${}qέԭԅ3{gU,ESF|#o!p葉4*|]zHG?U 9@~~BQ~_ҋ[,qV*@:QWα|N)bRuRJbpj+NZ$-bSE{KqVO.kO|jP*H#[`">"s!$@dOxGޑx&L__PRYDNG)%o7b jwŘ< F,γdifg({[6ukELq苞TE\4֞xwDv-A&^Iͤ(0# nNjq+ {{ ^ZjZO4|֨;JcF$#_&F6qP`$ \H^j]pb:(% k`ϤJgsX|cKbt]ͥ+i>w#u0SEҋ\q% a?nG#Vn.of훵w>:uL Ry<hȧ#J Pb)yX,c4;, `,&c T?Za4|{i)Jeqy]`Ɂ.^/$Nɬz4ǯG~7&rea<둨+”Oԟj|/8Gs39ܻrޓ;h4dDJ$5_fꮫ_&„֑x|gBU*NjZKv/Yv[c:3O1WqHc|e|4PC~=&IUOmÂWR\Sa}#{VTi"$ҵO'kP-KUOL n:`?..omDTU [L"ݥ Rzpk`Yۮ]M;h٢s=[Li?.8fB2̝͝םv*[ԁၖxTVa4@'fJqQIlʞjunxrTq Xi4疞[vMvmٵ:JBqԊE4J#ql#oXc^(^|s9vYsO .!r]E@)%[1MҔE`)!D*^<䂯_X+(k*J#βpx)G,{A>C!̙ TIT7۟+^ɩ@WxNYfPWi-ӷkL1P.mtGwSf!F el׸*ވ7(*Uz#"xW8Oj/G(W+do?c?w!A@ c;l(fAIt5RݤRoo]堫s֙η0pVMVԃot-!w ^̤ͨ.v]kkǡT9o_9,VeA#KaBhMEs{u׍<:(HZV\TAq!4]dm֖OOE`/B.hhs8sJ|j`T"U};TPO0mqQaly^pl/LPHlx+RՆHWfZ}CkNiŖ )y9z*Q]I ITHZh &[g#_*r\I=j;9ęG7ڰkCXe`R$1 VRVp#,FOF"3Zc"P3N3N3Nr%gK&L.eV̬Y9s3FgfKpUj3Wq}kLƒ* ܁]־)_xkjԴ!ܼ{+Ū.CV /Yo` +Gc/ /䣋<ҐU=m3M]y"Mx oU3ߝbC~ `;8G}yRm۾Q 70(#YH0?FF=v{.Z4hjsS6Jmd~d̒J*y!^B,B8Ίۘ~RLan|)Tǟ ھ .w,S pG&} OQ[Ԇڠ{p-T1{~س0 =[=]GGr_̎*|E}i+M[b)g&$;_ [BvH;(z1XU%WUmɶM72.ELe-X ,ze5݈gԑ:RGV`b+Vdz鱄؄؄Xc\^tyU{TQ!C kZ.u@zz"%+.YpTjbTCLf^d"1B1o=?%U?d=&z(ު-,/bϘ=cˎԏԗm,Nd^菲JƷǧR?HkYUVUtJtfk֪zzz3y_=FaFa `Iʊ)+[lmcccoo6m[f_S맮]nmmmM(P8p^}^}^=5FԈas؜(h&YLy i KXbVa;w..V***ʰ,t)<A6 ! 5 I!kJ7׭m?TEN1@ uzo/ Fؠ4^v>z]Emuu`RHi@&2R)R5 U.ԧSد*1 Z/3У.kjPI65L@ 5F2_)<@9VUƸ=Y{gF7ݰLUh&82YV~TD<ɓ< 7v$H(G`}Wt[>G'HE]`W *|rICK4gٯa|*p`1|.K&SW5MKE19#ssHչj|M$HO#tYwgL(S>;;)FTJ%ۈϊ,d(/+W==nһZ.MiAy7~C\c)2G)'tvPv,wcx8Ҵv5IGi·땻%^ۻlZk Jiׂ,)RNm&L6z(#L UUJI?qF>+KKDJSU_xfREGNZ~ e0cP潿P|8Y1S$H, 76Dz;Ae[F0AZ!vE_47dZOw!s 'IY?NH}UfJ}E'KmKGv'HˤeB9u{]ܷzy"n|]MNm~JTW,k!ID=:/^+(*WŨ&0:Or?r?0|RR;e3o#A:R'50GQ5^\&fh|9X`{-/4l꼑!SuLHg|%},EqEqj2ߓ 4\7,~2-EP7զu NH)xFV<5(}, gi!{b^yxQCԠ,0\u繣|{D+!]\_I-wuRȗ7 ׷\1|ý(|;N6*|lɢ%xAKD_&6ԣˈw~Uk=\&Hzc$:!^6TIz|-)?ly̘{ݯ]J{m1gRmކS<2 E.Nd.gJ]rs] ^gɣޗ}PF(*##|"|7/.Һ=z"UQ4F?(e fYM@h!Ѽ3{DWI.r(%9@s$ߗ3I&dE'yR^::rFۆyxa*i8|bSl>9erdz)ha?i1BViL |E_zq0XFkHQ[%J. -5#c1:e%cG煞R_bj {?hS)={>oQ ץfݢ̘te):I*AM"RlfGV~mᒅK^>x:28?%&"m)W -nM}x_|2z 뽜'|OzG|'e-{yנ;ͦF8|c¬9/  jүߟY>hSپ{sVi>fQVOD:*^+lRWϊ!4Wi(1K"*/j~_CfV#otB\CB yLwqwQuQܕyygxaT-ȏhDzQ/c{ 6-d_x\7; 1/яx0?EJ;~jë,ܼZ˒ȋHUk!ACC#A!B$Rs3\_zŰǦsVR͇% #DJA3 ?nCA/qK2.<)'%'FVycZhm&;3f)H=4Fn@Ԉ)$fEjnp |8#,OߣD^0faW_JYW_= "\<6'bWw[z<~e5{X;ڊgo Mt0 K/ެ̳΂K}Z=DY9'rIm핕SxnB{`mYl_ `'9MVx>)nxF[HDt.ew="Q0ƯGQS&77"~V RDn{5#<8 OxSSRSRS_ .d]ȺiVmz[G+?RRR(̎{ HYPB ykޚMdDEˇN=&0Q棲 Ah'ǘ(5#7DOzhlvE{.QoaK]|H3w3_"i "Ԓ%l JqL⣩vCcZ%,hBC'֕uRbVIW<|CY~B s>O&.͐fM7a k+"ߩޫʡ^XjMBw̞rMqUיem(ڥMHD͕HנA2>ګ>)%99$3"?: nSoDMfO,._NH~r}TpkRA[ (m5M`./^~wzm2>Y8S[,VgᬌH^UC\{T[8ayQU2pILݳN|& ` 'PoTP-1+f.³ݣ>gm,Z֫vf'WA^GH0o$?|$K`Ȅ([:obzEc^Ug琹g۵[g=ؔPvay^׵\pΦMt* s*z 䡙X,Lx) f?5;'ֆ~ީz+p/ &b{ F3Ekp Npa(;jԏN ׏׏׏pppLr-ZHLHLH ;L 2%EJR$9?vO=6C}`p}- @2gOu}D~wݴGm\pB&>)I Īnc~2,.-lQɝ7QwQe^/3i~M$<O5ʳKГ2bMZʤLM\}K(Ոeg"a))G}q#<"o3.3c8艞IˏD&7Mx}>O<=hl,#Wn7T@yqUEB kҢE#NUdq;_9TzN A 8a<=< PK$!0{臙5y&)pdȔʹ]rX :9)BQ̂q @iCo,/BbVl !K4P`{M],֋]H XzZȉ6w%YcwZ߼{g][wF ұ[ʋK#lvFȤHs6m>Ơ~͹7^k4F+ ` 74A@BBa~(iX\7.SQS?)VJ‰#%g_P` }y:B!=aPQ& Dͧ4p.^,;HIqME~}zJ:OQ.s|b82w~^dQ_JxO,^7R{ kup?i335'T}AxI_kAA"+s6vf~A/[pN餣ct69EX4,Lk0a|̱ovy=wȵ#n{oWba].MtVJo @Hw>3vuh37r6hE޶;ԉo♘0좵bN ű.ͽ`VMjB5i ~Q ηgXrS^LSJ){@^-4!'}acJzu{~ Mc`ב&h:Jge BY8r0Un^7 iKOCR~("?xXeQ2\xsad;v5^7?Z<ױSEE3 7MEHɊѬS7r\y/<pֻRסTgBJn}qV_ TЧ1 *d^Oq>H:d/YqHS{|+Ƣs:trx"wm+K?,ũ?,QOub"]KXd2>GQ<]h?,JR졢/W<&[>{1dk /?&ޥ⥘AL6(v,R(X)Vpo$+L ihpw~;:{lȐ7V*fZk8tP^^^3i s(<`T*9Ė3El?˷ͳl |e΋C *Q{rܕE`̫(?mI*?&)+rymVtݩ'MO>! (THf֜eW u{.7ȩg, J//Q>.Qm2Qb0景7(8fqU}g?-{K/)YHG.Ez+Dw]rt11ə":z^י닭/=~͝77u;̏usOI.bB8?6?rE^iyM;1mM\ò_ Kvs-toܤpWuqoJN,i:\WY^(JB{iZj[❢S)~_Ѹm#5-ToէWj_<ٿI ð~?\~_ ^\S`ag6oCޗj9 zF(Q9:3y&U&„}h[xB>Yyfeh6vi>.2ܻww-TKg,(Dz'nW.Ь{T6Oz/^[/KsRg?yœb/3ɂ͛)=rΎJ;*]{uU%| )zҐ7Q1h~_O)u]׬:od7{QE^Juʯ0\i9PJ 9gߣ'D+~5sO6"/JvԎ.J5^܋Qd]!}Z/^덮7#fkGuj߼}̼_~ Qe8} Ewx@2 ߨWyߴnVHK'giUOzl]we+Qߢ4F` ~Ie@NJ ~P8o޺uͷK%/هϛ>ɝ?p[o&+H,!֑Rgxُ A>Pф?Ϙms2Dy[Bh/-S11`p⡨Hㅲwg~| ~+bl%ԠH 'N<I9/F\ 0œ/6mh=be}*K ,㚮4CTtJ1od';|5S bw,O#Xd'>H0=XtZ3Mޗ! XLD莘*o!kKu(iϧ?x~oy浾uO^>y9X1cv|7ty>VQ|Kȏ[p դbťB @w&ñ|$U l[_~_'R.L S0ቺ.)Vse=vigigԛz-M)eUP7zG?Z~E.8I3 {|-pҾ_(w!C7S){AMj{@t[MzŶ6n]^muEyG*ϝ3/ǰ`;F !fCk*A+hy(e#><]┰!YN1qһsh8u_ih%vڬ ' sr0tQֻz/T /MaNu hLq~䟓֖y3ӻOyEE{mC ݼ}>9$fsG{L# ^u4R"%(YR*KDT8rW<1NQ2y=Z'^%K| 9 ()f~_^:Z&.hz8dc$J" o9Tܩy>FY mx@:e o%xW0 (EAB(9| dɛf09x#yQ)r@~:d^9=XDa';_/"|ȇc]"Kޟ*sejJ^ό2*yufJ~s:/-F!Y3P4F'tT4Mx$"}kAP"nԄezK1cwܪKw#|$Nь+nxn9w^?th@{݊^IX Km~ \"բ"TSEPw0lJ[9~_eo{)kt[Rkp%zo2o#bkE%9Ӡ\p{Q@>Q~ a49b gbͯ:]~XAz"<ɓⲺv佃ϠZa{+_ Zyzwŷ 䠿A(QnM _W'EMQZBm~ҧ4~QHI"&$Di1-&$WdB&d"J44@@4n-"SaBUjSoODKJY}WKwnzESǧT{.zݷ:7f'\vpYNHHICy(|.<YX +AVdE;8l J]pD7ǹkzL=\9FL6徶I*#A":/~x{|yj@l ەRvtM!Z/VCaV*qZM[g,WYz6<04>ͣyݲc lG%/FvzE1^ eep#2_ƷsJE,wDg"1r[g3rd i]|95<Be|&78nȳ iJrݻu.a 6'~Uxwk+Y>0a/3[[7EX>7@)q nh<09L NvC@@ :$a[Jp  іuq(騍\yt:ӑOgD>`%pӪ4fĥTӵ;2 Lځ)`,ցA!@0 `ܢJpe݈sKg7uqYczY,s'{ =R` }at(BSb3taP fnYe $rZXb)Pa` tz+g@<pB0S4~ʊrWׯML$[{n-z(K1.b> j wv7 zc8Ldph0#I:t% 'Ef,^.s}Q7(V5sgQĮ:Hߝ%msJ2kbgavqj湮j^*GP vUzJ=%wb'vp,Y8p9sl9&9JczmV٬Yq8js;vx)tTNfa#IOƬDfy2sթ޳Zcfyzn:(g(F`+91'a X%V A-]NwʗJwpz:h:-k(.  =B"H($ɍlٯ\E\Ï @S/RB/T?!5)ȪLZzkzvyM61iJ1ؿh#xW\7ˌ5geћ58i>XHRk#1rX@ B0A,BM 7+wS]݇CS-@] ;%E!Az_G^@PCL5Ϙز]#UDžsv""*Ъ~} i8Eއ4h4M RK_sÜoYsWs1L̤1fMHC6Yat)\X`]Aѷ6_5_tǼ.=̐m,QQI"&JJ\Fu\u\j-FMY0 a4L4^%jallR?~J}*j﫽 W(\pCJۖ-6oJ߄$ȥK-=NOVX/kaREzg2;:7#.W_ӼH{DꦚZm Π {蕡)顇0)tAKEo&ש衁2 iʅDcNY"L4ڙlSgjM!@5Oױjڴw+k݌ШυGXe$.ϛZ[o242_*\9S[iB5WaTxDb(=tmh16Ŭ] vs%pۂg:7O}g2,2ߔ.͒6DwX{SEk9KASɄUE_Q}Pp)La=t^XP^Rb>=USF1L5=rc<4iSx׹6N^zV|R0DI g #HG*X6dK`Cx]5Uy˚,>Q-kS@y23O?W,cy[~RuTACWhA}._u'տN}Z@ zH E^׼ş:ZVt/s =9dfG̎ ;X Ԁɟj U8E8M@r%$p RE"&ʬ28-f8&N6`ؙA ` uTJJ݊k--yff,W]ծ<&-GZ]TT G:44O] uZ__EӅ d>Y0!]WP`MShaF9^MM3kg/m5{l;v"uTzssW[Iܲ6tX/!?ͿeAׇ$R.qUf4?׿+PikER19d䋨Xu^|l0 M;*4߲O@pcUML6:`h ,`I,'\QTݩTĹ- fr|xqOjv|I/;,z/z:|S25sLmA}˩B9 5_ۇp6W=wwbċ5i ~]-+_|5l{2>m}f*ogL;ڨڰ&L&H- [Vg FiH,`==ħiFkF )=VU՟ eӴ@Ɠ/PoWotWuWE1RwQwᩚO==v%+Jb5V ;ΎcE*d44!VV&&&lۖ7e+lk9Zza$|^J!@ݡpthb  ?e3!ΡWٔ+nRq`GEʩqWbTCc70c0u$"i|7ŽߒLh0STŤ"*QOO_}#Nn'|r{.QB.FMX"؅0lFTWɖ8";&usiۏWN|azUoN8\4bk62V%eV?t79}^/s|W8QЭh[('yߘ̿=AӎyUYՄOxFx-NgX%vFچuctR1uſۯC*g <d53߆'-H'=e+Y|3f=,jeTlC%gjD3땪6#H@\KRc_LЖala[eQZX ȷsռm6쟲&GR}+oNC]zx< r >x 0ۦA3H0yD$LxaU@v'7 izN Fs7ѬD]9 w)d4g&8zx܇9$g[oi\٠ VeYnD_ESI[j[^p&L3^^2He{v&}n\GP.I-rYRuҴnQ]MWͶmU32b̏Q%0Y!iUS22deN˜Cl1Y6`^Au|Y#FIɴhFaؠJ1{VG.8B,D6MDEvȇ|B~$H`x sAaDx%Un[ű7\yrTW+l(|jrs xSE$  pC)#%eŅ:kXDLDAC6cتVWU:۴!{Bg {&nlR>Z1;3&]56ұ<o[t/S䦕SF-&3'>Z8p$,+E)S[^1r%*UP 6(BB葌7HûdC/%7pWYSF6pkP W^e"Onjf[Ojh/ LYENָZ0i'|yR暌^7T6>.516SUeSHY|-GZYR)"v jpKmUv+E΍K54c*0Cp8T`_kx[t 15tg0Q>7QC / ;`@ 58&a*l1jZ%Q(2ȉ"(WSOFa T #`gLBX)^oN ZWvOE#>P]*ӶO:}Y d(<-Os+{z{^6`SdS}sG7\b)αi"z`~F c$>5 RqaYg f#O>j-N߄Sw;̼!ۂz6f.Lr ]D{/L,BZ3NeXp>6߄z:A?{\ ڰcY%a-ed11? F7?)8zlAb*h~#۬G|F8)XbQDчJ,C}DKX)걜\1% e`r>S/bR!APYa#-9@#k4l-aUEe,vGdg fh/=_QBs1o窷7ڽxICU]*fXP,'Ig^fw9$X|Q}aioX4 Tgjún(hgT@8@ @94A۸hD"0$y!Ƞ{txW)B( ,:(茢lh(r(pD9C. t)uN xCq=TB]7 iY(+*;. ΣPE_W<{?;"wNS, ݕZ`0j=1[7N{6oƐK˒F[$vY.r`߹kQ%-P0bs( ޾tch겲3 0G>tC ؼ/wŤH09"0idXة[Nk{$]lCxm7x.:uWE*[0cMYXFX :ݨȎ3/4`YiDAE1XP(}G '"U:kź!K20)pԲ%Ϗ+st_ G(E`8seACo,4ACGʍdBQ8**nZ]8yS$65U -׋L ZV.ť"[K[U(_cƢ~_ \цn{ɜѝUH`"Je&ɲH+L7FunR^EAYZ_O8`M }3{k!50qWмE8kSbF-JV>ڶ1 xcA8$9;{3Q`(H8/!#K2vw=6x`.DKK$,>0S5=:A4' [*#RG@ ,B?gq+ػqn..W#JIqKu?FA~#X@b ہFȅO%z`(tǚ̝ҦqVȦJ< X}_es2Q4#ˌK *" j-rS"6 N'VKxc?\UH=0R~:zz2]w9Ѭ˂-vjY,zB}- .0y[;LR4k~D?֍@=npBo |5'#2-AEprYlxdz,aGZ?Q0Ń+e.xk<=wt[QAMR[?Px|X.W*cY-isMbM3t [.@R43%BZ/|rzSsn'-0K2?֬/Z 3M]F0B_15(ǶKqZ~.ċgZ9/VNBCW۪G-gտ:wy'X4/P߱HR\ZbT3Fx|qfC-(̆(bb4Q}q+c,0b8K8Eoq= NIc?V怸V*3ohRج̔Zoo ԍ.Nmj˖l;籼Sd*WyK˟ElWɱSz>|åp@&juOjWJ;{Zw0+gD+N?opoDY9DQi HQ v#[91*` ٠![i*XB$|Uqrt8)=d\u- k3bQ7Ǵq~]"mZ/cSpfic|J 궨hM+bF[?7qm ^8Lo?B/N_T2嶼5/R_,F(#l%K*jb>f_ݳh׈C@Zbs9V'gIrӅ$MS7z"VQck//ؗiwsXn*:ƥYVY,uWBfmX٣5AFq q1[tbEL<Ѐ8QPE.QH~ceLfH4M6XRʚLݻdw͵bv 4vϩm%1V#~{ZS}A) "tDA@3;sS==衏1ƺF"ţs8ۦjTz\ g絥z tPq]x &liB]Xk `XyfM/_y+Q! @8(">56a:p6i@*hG&RQ=XX"? k^BBA)l *X=T-L`;} -n1ŝUOS½ 5qqz[ ~Te7.ֳ/(nim[==su:I@US%=AScvĊ"j{(ȕݝi@N@:6PYR,%gDG o"xi9,)ݣ'əV֤O:ϱۏgl<U)K (*KR c)`=zF 0G.TF5*#&"HK3\›T|]|ieJHFin}R)Gp+ʯ,Ad! !_1xI =KLh.X d@jDmnuXQ3bGW5lNJW_2#cYT,bg`( 7+#a)/yC!jh-` Ċd]k5ƔG]Hq^EdY;*ũ&>&WL3ELQU4Ѱ5&L[4k[jbTUuK놪c-;2-`]Zu snzlC|47*E+5H'b?MM,(slBn1 ~1L Sr[z ѐ;d;`!aݐ=Cvai7OhAe(F15eX2K_8jq$Fb YAofͮ 69Ǣ;W8*L~\mbc=i.sJ\C~s]Ƅ]/wbXx(l%7x?(Df"Nq,astPX H7;&ۆj "al5b4fnmJ*v/۫<}nTʽW}EOj%wZ$Ĺ B;[#~Bdjaۥ$U Jxs<]T1>)&xNf"^sMgo`T]ͿnZihf&71 R 3MSWx]NU194if2WZC({vLBNqǘr˕*wkUS,]6ȑNG>=)qx/BlCGy$WAxaws<3k _  (DG!`3l،(G6{ ,QJ SX]&y&Dg1bUω{jKb~i*T?S{r#W*BuJ4o`2Sn.}߀{8Ď1x25xG$`A(ቶ{8u" osR(BĿ4MԮB [[B9a\(Fqe qu8q9P/р"v ( p gpȓxƒZ)V&qn_4G⧞,DI O/&uEi4Xs$\'s椛QIn9Nɬy\';:L邥x͔'r}|/44.z$f˰/%jCrH @ܔޡf`K*2\5ƓMׇk ݀уY@M`4 伩'Yl<; q-@Jpqdن>xlK G b)ۼY"m~HJvlY%lȮS9E^J_{(ݩztgeI@R12'eK7LJx@sB"fn;O~2Kq%@a82H" cE}N-pBvhD=h^4Qr א6:CT}xmxjn(Nԁz, c}xĒ[],urNuvߔj`@Bi,㔾(5SXҨg֨ŽR+ܟD@MMg~0ST3ɎdGb,m S|5J*F0LI%[n^w%'x/,'M-[v';&җ }iY7q\|$lmKsUĹԼ_qq*!n^u r%G˹uaKOjSzuD;}}&FavSiP sZ®~o ᦎ%MU+!x|MDJHtX+d&͸8T"*Q7*p)F\DJfGc72P]lY2Ql8I,"tCD,'ore#B\p#d2^e888$! IώFsWamYH:fљTC$MqaeipWq狵 ԡQFzKX_9AZpw;ldWAg$a:T܏$JE(tO =t}.MYo #B4A/d.o|j`Mcћ5!ÐD& l'у$+0ۅdoͭQ "-Π c l3(Ew;N0Jdl֡Yl9a2ag!f1k&2@XjT# ag.l9m9m9VgI3i&?ZHuݶ\p[nxZޞZSuε}(BD-*X=Gӱm[z>_*xy9K=% w!y##MWm-IA֋5.$A7A 3&aPnNQߏs" n X A`~D#ngkq6 o%H)Ud?b\ B}JZl -#`\6W7OG ֍?):Ep\.~h4ׄM{0#x;=  Y QdI2莗qd #:h/!K ;]LWᇁ[oܨe5h@-*7dXQȅX۞n"/ ft@WXIb1 >A6 [#} _aa艞]Fh+ݚFh4wuZ&Fhڅ5F%<ӝkz"zTXtCommentxs.JM,IMQ(,Pp 7}IENDB`rickshaw-1.4.6/examples/series.html000066400000000000000000000110671225123340100173310ustar00rootroot00000000000000

rickshaw-1.4.6/examples/simple.html000066400000000000000000000012261225123340100173240ustar00rootroot00000000000000
rickshaw-1.4.6/examples/socket.io/000077500000000000000000000000001225123340100170425ustar00rootroot00000000000000rickshaw-1.4.6/examples/socket.io/README.md000066400000000000000000000003551225123340100203240ustar00rootroot00000000000000# Rickshaw + Socket.io Just a simple example for Websockets support using Rickshaw + Socket.io # Usage ``` cd examples/socket.io npm install node app.js ``` Then visit `http://localhost:8000` to see your graphs updated every second. rickshaw-1.4.6/examples/socket.io/app.js000066400000000000000000000022431225123340100201610ustar00rootroot00000000000000express = require('express'); app = express(); server = require('http').createServer(app) io = require('socket.io').listen(server); path = require('path'); server.listen(8000, function() { console.log("Started a server on port 8000"); }); app.use(express.static(path.join(__dirname, '../../'))); app.get('/', function (req, res) { res.sendfile(__dirname + '/socket.io.html'); }); io.sockets.on('connection', function (socket) { incr = 0; var sendData = function() { data = [ { "color": "blue", "name": "New York", "data": [ { "x": 0, "y": incr }, { "x": 1, "y": 49 }, { "x": 2, "y": 38 }, { "x": 3, "y": 30 }, { "x": 4, "y": 32 } ] }, { "color": "red", "name": "London", "data": [ { "x": 0, "y": 19 }, { "x": 1, "y": incr }, { "x": 2, "y": 29 }, { "x": 3, "y": 20 }, { "x": 4, "y": 14 } ] }, { "color": "black", "name": "Tokyo", "data": [ { "x": 0, "y": 8 }, { "x": 1, "y": 12 }, { "x": 2, "y": incr }, { "x": 3, "y": 11 }, { "x": 4, "y": 10 } ] } ] socket.emit('rickshaw', data); incr++; } var run = setInterval(sendData, 1000); socket.on('disconnect', function() { clearInterval(run); }); });rickshaw-1.4.6/examples/socket.io/package.json000066400000000000000000000005371225123340100213350ustar00rootroot00000000000000{ "name": "rickshaw-socket.io", "version": "0.0.1", "description": "Rickshaw socket.io support", "main": "app.js", "private": true, "scripts": { "start": "node app.js" }, "dependencies": { "express": "3.3.5", "socket.io": "~0.9.16" }, "author": "Alex Williams, Unscramble ", "license": "MIT" } rickshaw-1.4.6/examples/socket.io/socket.io.html000066400000000000000000000020721225123340100216270ustar00rootroot00000000000000
rickshaw-1.4.6/examples/sparse.html000066400000000000000000000023711225123340100173320ustar00rootroot00000000000000
rickshaw-1.4.6/examples/start.html000066400000000000000000000007671225123340100172010ustar00rootroot00000000000000
rickshaw-1.4.6/examples/status.html000066400000000000000000000027601225123340100173620ustar00rootroot00000000000000
rickshaw-1.4.6/examples/stops.html000066400000000000000000000031431225123340100172030ustar00rootroot00000000000000

rickshaw-1.4.6/examples/timescale.html000066400000000000000000000021051225123340100177760ustar00rootroot00000000000000
rickshaw-1.4.6/examples/x_axis.html000066400000000000000000000026551225123340100173350ustar00rootroot00000000000000
rickshaw-1.4.6/examples/y_axis.html000066400000000000000000000023021225123340100173230ustar00rootroot00000000000000
rickshaw-1.4.6/package.json000066400000000000000000000006761225123340100156250ustar00rootroot00000000000000{ "name": "rickshaw", "version": "1.4.6", "dependencies": { "d3": "~3.3.6" }, "keywords": [ "d3", "charts", "rickshaw", "svg", "graph" ], "main": "./rickshaw", "engines": { "node": ">= 0.8.0" }, "devDependencies": { "jsdom": "~0.5.4", "nodeunit": "~0.7.4", "clean-css": "~0.10.2", "uglify-js": "~2.2.5", "jshint": "~1.1.0" }, "scripts": { "test": "nodeunit tests" } } rickshaw-1.4.6/rickshaw.css000066400000000000000000000161151225123340100156570ustar00rootroot00000000000000.rickshaw_graph .detail { pointer-events: none; position: absolute; top: 0; z-index: 2; background: rgba(0, 0, 0, 0.1); bottom: 0; width: 1px; transition: opacity 0.25s linear; -moz-transition: opacity 0.25s linear; -o-transition: opacity 0.25s linear; -webkit-transition: opacity 0.25s linear; } .rickshaw_graph .detail.inactive { opacity: 0; } .rickshaw_graph .detail .item.active { opacity: 1; } .rickshaw_graph .detail .x_label { font-family: Arial, sans-serif; border-radius: 3px; padding: 6px; opacity: 0.5; border: 1px solid #e0e0e0; font-size: 12px; position: absolute; background: white; white-space: nowrap; } .rickshaw_graph .detail .x_label.left { left: 0; } .rickshaw_graph .detail .x_label.right { right: 0; } .rickshaw_graph .detail .item { position: absolute; z-index: 2; border-radius: 3px; padding: 0.25em; font-size: 12px; font-family: Arial, sans-serif; opacity: 0; background: rgba(0, 0, 0, 0.4); color: white; border: 1px solid rgba(0, 0, 0, 0.4); margin-left: 1em; margin-right: 1em; margin-top: -1em; white-space: nowrap; } .rickshaw_graph .detail .item.left { left: 0; } .rickshaw_graph .detail .item.right { right: 0; } .rickshaw_graph .detail .item.active { opacity: 1; background: rgba(0, 0, 0, 0.8); } .rickshaw_graph .detail .item:after { position: absolute; display: block; width: 0; height: 0; content: ""; border: 5px solid transparent; } .rickshaw_graph .detail .item.left:after { top: 1em; left: -5px; margin-top: -5px; border-right-color: rgba(0, 0, 0, 0.8); border-left-width: 0; } .rickshaw_graph .detail .item.right:after { top: 1em; right: -5px; margin-top: -5px; border-left-color: rgba(0, 0, 0, 0.8); border-right-width: 0; } .rickshaw_graph .detail .dot { width: 4px; height: 4px; margin-left: -2px; margin-top: -2px; border-radius: 5px; position: absolute; box-shadow: 0 0 2px rgba(0, 0, 0, 0.6); background: white; border-width: 2px; border-style: solid; display: none; background-clip: padding-box; } .rickshaw_graph .detail .dot.active { display: block; } /* graph */ .rickshaw_graph { position: relative; } .rickshaw_graph svg { display: block; overflow: hidden; } /* ticks */ .rickshaw_graph .x_tick { position: absolute; top: 0; bottom: 0; width: 0px; border-left: 1px dotted rgba(0, 0, 0, 0.2); pointer-events: none; } .rickshaw_graph .x_tick .title { position: absolute; font-size: 12px; font-family: Arial, sans-serif; opacity: 0.5; white-space: nowrap; margin-left: 3px; bottom: 1px; } /* annotations */ .rickshaw_annotation_timeline { height: 1px; border-top: 1px solid #e0e0e0; margin-top: 10px; position: relative; } .rickshaw_annotation_timeline .annotation { position: absolute; height: 6px; width: 6px; margin-left: -2px; top: -3px; border-radius: 5px; background-color: rgba(0, 0, 0, 0.25); } .rickshaw_graph .annotation_line { position: absolute; top: 0; bottom: -6px; width: 0px; border-left: 2px solid rgba(0, 0, 0, 0.3); display: none; } .rickshaw_graph .annotation_line.active { display: block; } .rickshaw_graph .annotation_range { background: rgba(0, 0, 0, 0.1); display: none; position: absolute; top: 0; bottom: -6px; } .rickshaw_graph .annotation_range.active { display: block; } .rickshaw_graph .annotation_range.active.offscreen { display: none; } .rickshaw_annotation_timeline .annotation .content { background: white; color: black; opacity: 0.9; padding: 5px 5px; box-shadow: 0 0 2px rgba(0, 0, 0, 0.8); border-radius: 3px; position: relative; z-index: 20; font-size: 12px; padding: 6px 8px 8px; top: 18px; left: -11px; width: 160px; display: none; cursor: pointer; } .rickshaw_annotation_timeline .annotation .content:before { content: "\25b2"; position: absolute; top: -11px; color: white; text-shadow: 0 -1px 1px rgba(0, 0, 0, 0.8); } .rickshaw_annotation_timeline .annotation.active, .rickshaw_annotation_timeline .annotation:hover { background-color: rgba(0, 0, 0, 0.8); cursor: none; } .rickshaw_annotation_timeline .annotation .content:hover { z-index: 50; } .rickshaw_annotation_timeline .annotation.active .content { display: block; } .rickshaw_annotation_timeline .annotation:hover .content { display: block; z-index: 50; } .rickshaw_graph .y_axis, .rickshaw_graph .x_axis_d3 { fill: none; } .rickshaw_graph .y_ticks .tick, .rickshaw_graph .x_ticks_d3 .tick { stroke: rgba(0, 0, 0, 0.16); stroke-width: 2px; shape-rendering: crisp-edges; pointer-events: none; } .rickshaw_graph .y_grid .tick, .rickshaw_graph .x_grid_d3 .tick { z-index: -1; stroke: rgba(0, 0, 0, 0.20); stroke-width: 1px; stroke-dasharray: 1 1; } .rickshaw_graph .y_grid .tick[data-y-value="0"] { stroke-dasharray: 1 0; } .rickshaw_graph .y_grid path, .rickshaw_graph .x_grid_d3 path { fill: none; stroke: none; } .rickshaw_graph .y_ticks path, .rickshaw_graph .x_ticks_d3 path { fill: none; stroke: #808080; } .rickshaw_graph .y_ticks text, .rickshaw_graph .x_ticks_d3 text { opacity: 0.5; font-size: 12px; pointer-events: none; } .rickshaw_graph .x_tick.glow .title, .rickshaw_graph .y_ticks.glow text { fill: black; color: black; text-shadow: -1px 1px 0 rgba(255, 255, 255, 0.1), 1px -1px 0 rgba(255, 255, 255, 0.1), 1px 1px 0 rgba(255, 255, 255, 0.1), 0px 1px 0 rgba(255, 255, 255, 0.1), 0px -1px 0 rgba(255, 255, 255, 0.1), 1px 0px 0 rgba(255, 255, 255, 0.1), -1px 0px 0 rgba(255, 255, 255, 0.1), -1px -1px 0 rgba(255, 255, 255, 0.1); } .rickshaw_graph .x_tick.inverse .title, .rickshaw_graph .y_ticks.inverse text { fill: white; color: white; text-shadow: -1px 1px 0 rgba(0, 0, 0, 0.8), 1px -1px 0 rgba(0, 0, 0, 0.8), 1px 1px 0 rgba(0, 0, 0, 0.8), 0px 1px 0 rgba(0, 0, 0, 0.8), 0px -1px 0 rgba(0, 0, 0, 0.8), 1px 0px 0 rgba(0, 0, 0, 0.8), -1px 0px 0 rgba(0, 0, 0, 0.8), -1px -1px 0 rgba(0, 0, 0, 0.8); } .rickshaw_legend { font-family: Arial; font-size: 12px; color: white; background: #404040; display: inline-block; padding: 12px 5px; border-radius: 2px; position: relative; } .rickshaw_legend:hover { z-index: 10; } .rickshaw_legend .swatch { width: 10px; height: 10px; border: 1px solid rgba(0, 0, 0, 0.2); } .rickshaw_legend .line { clear: both; line-height: 140%; padding-right: 15px; } .rickshaw_legend .line .swatch { display: inline-block; margin-right: 3px; border-radius: 2px; } .rickshaw_legend .label { margin: 0; white-space: nowrap; display: inline; font-size: inherit; background-color: transparent; color: inherit; font-weight: normal; line-height: normal; padding: 0px; text-shadow: none; } .rickshaw_legend .action:hover { opacity: 0.6; } .rickshaw_legend .action { margin-right: 0.2em; font-size: 10px; opacity: 0.2; cursor: pointer; font-size: 14px; } .rickshaw_legend .line.disabled { opacity: 0.4; } .rickshaw_legend ul { list-style-type: none; margin: 0; padding: 0; margin: 2px; cursor: pointer; } .rickshaw_legend li { padding: 0 0 0 2px; min-width: 80px; white-space: nowrap; } .rickshaw_legend li:hover { background: rgba(255, 255, 255, 0.08); border-radius: 3px; } .rickshaw_legend li:active { background: rgba(255, 255, 255, 0.2); border-radius: 3px; } rickshaw-1.4.6/rickshaw.js000066400000000000000000003000601225123340100154760ustar00rootroot00000000000000/* jshint -W079 */ var Rickshaw = { namespace: function(namespace, obj) { var parts = namespace.split('.'); var parent = Rickshaw; for(var i = 1, length = parts.length; i < length; i++) { var currentPart = parts[i]; parent[currentPart] = parent[currentPart] || {}; parent = parent[currentPart]; } return parent; }, keys: function(obj) { var keys = []; for (var key in obj) keys.push(key); return keys; }, extend: function(destination, source) { for (var property in source) { destination[property] = source[property]; } return destination; }, clone: function(obj) { return JSON.parse(JSON.stringify(obj)); } }; if (typeof module !== 'undefined' && module.exports) { var d3 = require('d3'); module.exports = Rickshaw; } /* Adapted from https://github.com/Jakobo/PTClass */ /* Copyright (c) 2005-2010 Sam Stephenson Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /* Based on Alex Arnell's inheritance implementation. */ /** section: Language * class Class * * Manages Prototype's class-based OOP system. * * Refer to Prototype's web site for a [tutorial on classes and * inheritance](http://prototypejs.org/learn/class-inheritance). **/ (function(globalContext) { /* ------------------------------------ */ /* Import from object.js */ /* ------------------------------------ */ var _toString = Object.prototype.toString, NULL_TYPE = 'Null', UNDEFINED_TYPE = 'Undefined', BOOLEAN_TYPE = 'Boolean', NUMBER_TYPE = 'Number', STRING_TYPE = 'String', OBJECT_TYPE = 'Object', FUNCTION_CLASS = '[object Function]'; function isFunction(object) { return _toString.call(object) === FUNCTION_CLASS; } function extend(destination, source) { for (var property in source) if (source.hasOwnProperty(property)) // modify protect primitive slaughter destination[property] = source[property]; return destination; } function keys(object) { if (Type(object) !== OBJECT_TYPE) { throw new TypeError(); } var results = []; for (var property in object) { if (object.hasOwnProperty(property)) { results.push(property); } } return results; } function Type(o) { switch(o) { case null: return NULL_TYPE; case (void 0): return UNDEFINED_TYPE; } var type = typeof o; switch(type) { case 'boolean': return BOOLEAN_TYPE; case 'number': return NUMBER_TYPE; case 'string': return STRING_TYPE; } return OBJECT_TYPE; } function isUndefined(object) { return typeof object === "undefined"; } /* ------------------------------------ */ /* Import from Function.js */ /* ------------------------------------ */ var slice = Array.prototype.slice; function argumentNames(fn) { var names = fn.toString().match(/^[\s\(]*function[^(]*\(([^)]*)\)/)[1] .replace(/\/\/.*?[\r\n]|\/\*(?:.|[\r\n])*?\*\//g, '') .replace(/\s+/g, '').split(','); return names.length == 1 && !names[0] ? [] : names; } function wrap(fn, wrapper) { var __method = fn; return function() { var a = update([bind(__method, this)], arguments); return wrapper.apply(this, a); } } function update(array, args) { var arrayLength = array.length, length = args.length; while (length--) array[arrayLength + length] = args[length]; return array; } function merge(array, args) { array = slice.call(array, 0); return update(array, args); } function bind(fn, context) { if (arguments.length < 2 && isUndefined(arguments[0])) return this; var __method = fn, args = slice.call(arguments, 2); return function() { var a = merge(args, arguments); return __method.apply(context, a); } } /* ------------------------------------ */ /* Import from Prototype.js */ /* ------------------------------------ */ var emptyFunction = function(){}; var Class = (function() { // Some versions of JScript fail to enumerate over properties, names of which // correspond to non-enumerable properties in the prototype chain var IS_DONTENUM_BUGGY = (function(){ for (var p in { toString: 1 }) { // check actual property name, so that it works with augmented Object.prototype if (p === 'toString') return false; } return true; })(); function subclass() {}; function create() { var parent = null, properties = [].slice.apply(arguments); if (isFunction(properties[0])) parent = properties.shift(); function klass() { this.initialize.apply(this, arguments); } extend(klass, Class.Methods); klass.superclass = parent; klass.subclasses = []; if (parent) { subclass.prototype = parent.prototype; klass.prototype = new subclass; try { parent.subclasses.push(klass) } catch(e) {} } for (var i = 0, length = properties.length; i < length; i++) klass.addMethods(properties[i]); if (!klass.prototype.initialize) klass.prototype.initialize = emptyFunction; klass.prototype.constructor = klass; return klass; } function addMethods(source) { var ancestor = this.superclass && this.superclass.prototype, properties = keys(source); // IE6 doesn't enumerate `toString` and `valueOf` (among other built-in `Object.prototype`) properties, // Force copy if they're not Object.prototype ones. // Do not copy other Object.prototype.* for performance reasons if (IS_DONTENUM_BUGGY) { if (source.toString != Object.prototype.toString) properties.push("toString"); if (source.valueOf != Object.prototype.valueOf) properties.push("valueOf"); } for (var i = 0, length = properties.length; i < length; i++) { var property = properties[i], value = source[property]; if (ancestor && isFunction(value) && argumentNames(value)[0] == "$super") { var method = value; value = wrap((function(m) { return function() { return ancestor[m].apply(this, arguments); }; })(property), method); value.valueOf = bind(method.valueOf, method); value.toString = bind(method.toString, method); } this.prototype[property] = value; } return this; } return { create: create, Methods: { addMethods: addMethods } }; })(); if (globalContext.exports) { globalContext.exports.Class = Class; } else { globalContext.Class = Class; } })(Rickshaw); Rickshaw.namespace('Rickshaw.Compat.ClassList'); Rickshaw.Compat.ClassList = function() { /* adapted from http://purl.eligrey.com/github/classList.js/blob/master/classList.js */ if (typeof document !== "undefined" && !("classList" in document.createElement("a"))) { (function (view) { "use strict"; var classListProp = "classList" , protoProp = "prototype" , elemCtrProto = (view.HTMLElement || view.Element)[protoProp] , objCtr = Object , strTrim = String[protoProp].trim || function () { return this.replace(/^\s+|\s+$/g, ""); } , arrIndexOf = Array[protoProp].indexOf || function (item) { var i = 0 , len = this.length ; for (; i < len; i++) { if (i in this && this[i] === item) { return i; } } return -1; } // Vendors: please allow content code to instantiate DOMExceptions , DOMEx = function (type, message) { this.name = type; this.code = DOMException[type]; this.message = message; } , checkTokenAndGetIndex = function (classList, token) { if (token === "") { throw new DOMEx( "SYNTAX_ERR" , "An invalid or illegal string was specified" ); } if (/\s/.test(token)) { throw new DOMEx( "INVALID_CHARACTER_ERR" , "String contains an invalid character" ); } return arrIndexOf.call(classList, token); } , ClassList = function (elem) { var trimmedClasses = strTrim.call(elem.className) , classes = trimmedClasses ? trimmedClasses.split(/\s+/) : [] , i = 0 , len = classes.length ; for (; i < len; i++) { this.push(classes[i]); } this._updateClassName = function () { elem.className = this.toString(); }; } , classListProto = ClassList[protoProp] = [] , classListGetter = function () { return new ClassList(this); } ; // Most DOMException implementations don't allow calling DOMException's toString() // on non-DOMExceptions. Error's toString() is sufficient here. DOMEx[protoProp] = Error[protoProp]; classListProto.item = function (i) { return this[i] || null; }; classListProto.contains = function (token) { token += ""; return checkTokenAndGetIndex(this, token) !== -1; }; classListProto.add = function (token) { token += ""; if (checkTokenAndGetIndex(this, token) === -1) { this.push(token); this._updateClassName(); } }; classListProto.remove = function (token) { token += ""; var index = checkTokenAndGetIndex(this, token); if (index !== -1) { this.splice(index, 1); this._updateClassName(); } }; classListProto.toggle = function (token) { token += ""; if (checkTokenAndGetIndex(this, token) === -1) { this.add(token); } else { this.remove(token); } }; classListProto.toString = function () { return this.join(" "); }; if (objCtr.defineProperty) { var classListPropDesc = { get: classListGetter , enumerable: true , configurable: true }; try { objCtr.defineProperty(elemCtrProto, classListProp, classListPropDesc); } catch (ex) { // IE 8 doesn't support enumerable:true if (ex.number === -0x7FF5EC54) { classListPropDesc.enumerable = false; objCtr.defineProperty(elemCtrProto, classListProp, classListPropDesc); } } } else if (objCtr[protoProp].__defineGetter__) { elemCtrProto.__defineGetter__(classListProp, classListGetter); } }(window)); } }; if ( (typeof RICKSHAW_NO_COMPAT !== "undefined" && !RICKSHAW_NO_COMPAT) || typeof RICKSHAW_NO_COMPAT === "undefined") { new Rickshaw.Compat.ClassList(); } Rickshaw.namespace('Rickshaw.Graph'); Rickshaw.Graph = function(args) { var self = this; this.initialize = function(args) { if (!args.element) throw "Rickshaw.Graph needs a reference to an element"; if (args.element.nodeType !== 1) throw "Rickshaw.Graph element was defined but not an HTML element"; this.element = args.element; this.series = args.series; this.window = {}; this.updateCallbacks = []; this.configureCallbacks = []; this.defaults = { interpolation: 'cardinal', offset: 'zero', min: undefined, max: undefined, preserve: false, xScale: undefined, yScale: undefined }; this._loadRenderers(); this.configure(args); this.validateSeries(args.series); this.series.active = function() { return self.series.filter( function(s) { return !s.disabled } ) }; this.setSize({ width: args.width, height: args.height }); this.element.classList.add('rickshaw_graph'); this.vis = d3.select(this.element) .append("svg:svg") .attr('width', this.width) .attr('height', this.height); this.discoverRange(); }; this._loadRenderers = function() { for (var name in Rickshaw.Graph.Renderer) { if (!name || !Rickshaw.Graph.Renderer.hasOwnProperty(name)) continue; var r = Rickshaw.Graph.Renderer[name]; if (!r || !r.prototype || !r.prototype.render) continue; self.registerRenderer(new r( { graph: self } )); } }; this.validateSeries = function(series) { if (!Array.isArray(series) && !(series instanceof Rickshaw.Series)) { var seriesSignature = Object.prototype.toString.apply(series); throw "series is not an array: " + seriesSignature; } var pointsCount; series.forEach( function(s) { if (!(s instanceof Object)) { throw "series element is not an object: " + s; } if (!(s.data)) { throw "series has no data: " + JSON.stringify(s); } if (!Array.isArray(s.data)) { throw "series data is not an array: " + JSON.stringify(s.data); } var x = s.data[0].x; var y = s.data[0].y; if (typeof x != 'number' || ( typeof y != 'number' && y !== null ) ) { throw "x and y properties of points should be numbers instead of " + (typeof x) + " and " + (typeof y); } if (s.data.length >= 3) { // probe to sanity check sort order if (s.data[2].x < s.data[1].x || s.data[1].x < s.data[0].x || s.data[s.data.length - 1].x < s.data[0].x) { throw "series data needs to be sorted on x values for series name: " + s.name; } } }, this ); }; this.dataDomain = function() { var data = this.series.map( function(s) { return s.data } ); var min = d3.min( data.map( function(d) { return d[0].x } ) ); var max = d3.max( data.map( function(d) { return d[d.length - 1].x } ) ); return [min, max]; }; this.discoverRange = function() { var domain = this.renderer.domain(); this.x = (this.xScale || d3.scale.linear()).domain(domain.x).range([0, this.width]); this.y = (this.yScale || d3.scale.linear()).domain(domain.y).range([this.height, 0]); this.y.magnitude = d3.scale.linear() .domain([domain.y[0] - domain.y[0], domain.y[1] - domain.y[0]]) .range([0, this.height]); }; this.render = function() { var stackedData = this.stackData(); this.discoverRange(); this.renderer.render(); this.updateCallbacks.forEach( function(callback) { callback(); } ); }; this.update = this.render; this.stackData = function() { var data = this.series.active() .map( function(d) { return d.data } ) .map( function(d) { return d.filter( function(d) { return this._slice(d) }, this ) }, this); var preserve = this.preserve; if (!preserve) { this.series.forEach( function(series) { if (series.scale) { // data must be preserved when a scale is used preserve = true; } } ); } data = preserve ? Rickshaw.clone(data) : data; this.series.active().forEach( function(series, index) { if (series.scale) { // apply scale to each series var seriesData = data[index]; if(seriesData) { seriesData.forEach( function(d) { d.y = series.scale(d.y); } ); } } } ); this.stackData.hooks.data.forEach( function(entry) { data = entry.f.apply(self, [data]); } ); var stackedData; if (!this.renderer.unstack) { this._validateStackable(); var layout = d3.layout.stack(); layout.offset( self.offset ); stackedData = layout(data); } stackedData = stackedData || data; if (this.renderer.unstack) { stackedData.forEach( function(seriesData) { seriesData.forEach( function(d) { d.y0 = d.y0 === undefined ? 0 : d.y0; } ); } ); } this.stackData.hooks.after.forEach( function(entry) { stackedData = entry.f.apply(self, [data]); } ); var i = 0; this.series.forEach( function(series) { if (series.disabled) return; series.stack = stackedData[i++]; } ); this.stackedData = stackedData; return stackedData; }; this._validateStackable = function() { var series = this.series; var pointsCount; series.forEach( function(s) { pointsCount = pointsCount || s.data.length; if (pointsCount && s.data.length != pointsCount) { throw "stacked series cannot have differing numbers of points: " + pointsCount + " vs " + s.data.length + "; see Rickshaw.Series.fill()"; } }, this ); }; this.stackData.hooks = { data: [], after: [] }; this._slice = function(d) { if (this.window.xMin || this.window.xMax) { var isInRange = true; if (this.window.xMin && d.x < this.window.xMin) isInRange = false; if (this.window.xMax && d.x > this.window.xMax) isInRange = false; return isInRange; } return true; }; this.onUpdate = function(callback) { this.updateCallbacks.push(callback); }; this.onConfigure = function(callback) { this.configureCallbacks.push(callback); }; this.registerRenderer = function(renderer) { this._renderers = this._renderers || {}; this._renderers[renderer.name] = renderer; }; this.configure = function(args) { this.config = this.config || {}; if (args.width || args.height) { this.setSize(args); } Rickshaw.keys(this.defaults).forEach( function(k) { this.config[k] = k in args ? args[k] : k in this ? this[k] : this.defaults[k]; }, this ); Rickshaw.keys(this.config).forEach( function(k) { this[k] = this.config[k]; }, this ); var renderer = args.renderer || (this.renderer && this.renderer.name) || 'stack'; this.setRenderer(renderer, args); this.configureCallbacks.forEach( function(callback) { callback(args); } ); }; this.setRenderer = function(r, args) { if (typeof r == 'function') { this.renderer = new r( { graph: self } ); this.registerRenderer(this.renderer); } else { if (!this._renderers[r]) { throw "couldn't find renderer " + r; } this.renderer = this._renderers[r]; } if (typeof args == 'object') { this.renderer.configure(args); } }; this.setSize = function(args) { args = args || {}; if (typeof window !== undefined) { var style = window.getComputedStyle(this.element, null); var elementWidth = parseInt(style.getPropertyValue('width'), 10); var elementHeight = parseInt(style.getPropertyValue('height'), 10); } this.width = args.width || elementWidth || 400; this.height = args.height || elementHeight || 250; this.vis && this.vis .attr('width', this.width) .attr('height', this.height); }; this.initialize(args); }; Rickshaw.namespace('Rickshaw.Fixtures.Color'); Rickshaw.Fixtures.Color = function() { this.schemes = {}; this.schemes.spectrum14 = [ '#ecb796', '#dc8f70', '#b2a470', '#92875a', '#716c49', '#d2ed82', '#bbe468', '#a1d05d', '#e7cbe6', '#d8aad6', '#a888c2', '#9dc2d3', '#649eb9', '#387aa3' ].reverse(); this.schemes.spectrum2000 = [ '#57306f', '#514c76', '#646583', '#738394', '#6b9c7d', '#84b665', '#a7ca50', '#bfe746', '#e2f528', '#fff726', '#ecdd00', '#d4b11d', '#de8800', '#de4800', '#c91515', '#9a0000', '#7b0429', '#580839', '#31082b' ]; this.schemes.spectrum2001 = [ '#2f243f', '#3c2c55', '#4a3768', '#565270', '#6b6b7c', '#72957f', '#86ad6e', '#a1bc5e', '#b8d954', '#d3e04e', '#ccad2a', '#cc8412', '#c1521d', '#ad3821', '#8a1010', '#681717', '#531e1e', '#3d1818', '#320a1b' ]; this.schemes.classic9 = [ '#423d4f', '#4a6860', '#848f39', '#a2b73c', '#ddcb53', '#c5a32f', '#7d5836', '#963b20', '#7c2626', '#491d37', '#2f254a' ].reverse(); this.schemes.httpStatus = { 503: '#ea5029', 502: '#d23f14', 500: '#bf3613', 410: '#efacea', 409: '#e291dc', 403: '#f457e8', 408: '#e121d2', 401: '#b92dae', 405: '#f47ceb', 404: '#a82a9f', 400: '#b263c6', 301: '#6fa024', 302: '#87c32b', 307: '#a0d84c', 304: '#28b55c', 200: '#1a4f74', 206: '#27839f', 201: '#52adc9', 202: '#7c979f', 203: '#a5b8bd', 204: '#c1cdd1' }; this.schemes.colorwheel = [ '#b5b6a9', '#858772', '#785f43', '#96557e', '#4682b4', '#65b9ac', '#73c03a', '#cb513a' ].reverse(); this.schemes.cool = [ '#5e9d2f', '#73c03a', '#4682b4', '#7bc3b8', '#a9884e', '#c1b266', '#a47493', '#c09fb5' ]; this.schemes.munin = [ '#00cc00', '#0066b3', '#ff8000', '#ffcc00', '#330099', '#990099', '#ccff00', '#ff0000', '#808080', '#008f00', '#00487d', '#b35a00', '#b38f00', '#6b006b', '#8fb300', '#b30000', '#bebebe', '#80ff80', '#80c9ff', '#ffc080', '#ffe680', '#aa80ff', '#ee00cc', '#ff8080', '#666600', '#ffbfff', '#00ffcc', '#cc6699', '#999900' ]; }; Rickshaw.namespace('Rickshaw.Fixtures.RandomData'); Rickshaw.Fixtures.RandomData = function(timeInterval) { var addData; timeInterval = timeInterval || 1; var lastRandomValue = 200; var timeBase = Math.floor(new Date().getTime() / 1000); this.addData = function(data) { var randomValue = Math.random() * 100 + 15 + lastRandomValue; var index = data[0].length; var counter = 1; data.forEach( function(series) { var randomVariance = Math.random() * 20; var v = randomValue / 25 + counter++ + (Math.cos((index * counter * 11) / 960) + 2) * 15 + (Math.cos(index / 7) + 2) * 7 + (Math.cos(index / 17) + 2) * 1; series.push( { x: (index * timeInterval) + timeBase, y: v + randomVariance } ); } ); lastRandomValue = randomValue * 0.85; }; this.removeData = function(data) { data.forEach( function(series) { series.shift(); } ); timeBase += timeInterval; }; }; Rickshaw.namespace('Rickshaw.Fixtures.Time'); Rickshaw.Fixtures.Time = function() { var self = this; this.months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']; this.units = [ { name: 'decade', seconds: 86400 * 365.25 * 10, formatter: function(d) { return (parseInt(d.getUTCFullYear() / 10, 10) * 10) } }, { name: 'year', seconds: 86400 * 365.25, formatter: function(d) { return d.getUTCFullYear() } }, { name: 'month', seconds: 86400 * 30.5, formatter: function(d) { return self.months[d.getUTCMonth()] } }, { name: 'week', seconds: 86400 * 7, formatter: function(d) { return self.formatDate(d) } }, { name: 'day', seconds: 86400, formatter: function(d) { return d.getUTCDate() } }, { name: '6 hour', seconds: 3600 * 6, formatter: function(d) { return self.formatTime(d) } }, { name: 'hour', seconds: 3600, formatter: function(d) { return self.formatTime(d) } }, { name: '15 minute', seconds: 60 * 15, formatter: function(d) { return self.formatTime(d) } }, { name: 'minute', seconds: 60, formatter: function(d) { return d.getUTCMinutes() } }, { name: '15 second', seconds: 15, formatter: function(d) { return d.getUTCSeconds() + 's' } }, { name: 'second', seconds: 1, formatter: function(d) { return d.getUTCSeconds() + 's' } }, { name: 'decisecond', seconds: 1/10, formatter: function(d) { return d.getUTCMilliseconds() + 'ms' } }, { name: 'centisecond', seconds: 1/100, formatter: function(d) { return d.getUTCMilliseconds() + 'ms' } } ]; this.unit = function(unitName) { return this.units.filter( function(unit) { return unitName == unit.name } ).shift(); }; this.formatDate = function(d) { return d3.time.format('%b %e')(d); }; this.formatTime = function(d) { return d.toUTCString().match(/(\d+:\d+):/)[1]; }; this.ceil = function(time, unit) { var date, floor, year; if (unit.name == 'month') { date = new Date(time * 1000); floor = Date.UTC(date.getUTCFullYear(), date.getUTCMonth()) / 1000; if (floor == time) return time; year = date.getUTCFullYear(); var month = date.getUTCMonth(); if (month == 11) { month = 0; year = year + 1; } else { month += 1; } return Date.UTC(year, month) / 1000; } if (unit.name == 'year') { date = new Date(time * 1000); floor = Date.UTC(date.getUTCFullYear(), 0) / 1000; if (floor == time) return time; year = date.getUTCFullYear() + 1; return Date.UTC(year, 0) / 1000; } return Math.ceil(time / unit.seconds) * unit.seconds; }; }; Rickshaw.namespace('Rickshaw.Fixtures.Time.Local'); Rickshaw.Fixtures.Time.Local = function() { var self = this; this.months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']; this.units = [ { name: 'decade', seconds: 86400 * 365.25 * 10, formatter: function(d) { return (parseInt(d.getFullYear() / 10, 10) * 10) } }, { name: 'year', seconds: 86400 * 365.25, formatter: function(d) { return d.getFullYear() } }, { name: 'month', seconds: 86400 * 30.5, formatter: function(d) { return self.months[d.getMonth()] } }, { name: 'week', seconds: 86400 * 7, formatter: function(d) { return self.formatDate(d) } }, { name: 'day', seconds: 86400, formatter: function(d) { return d.getDate() } }, { name: '6 hour', seconds: 3600 * 6, formatter: function(d) { return self.formatTime(d) } }, { name: 'hour', seconds: 3600, formatter: function(d) { return self.formatTime(d) } }, { name: '15 minute', seconds: 60 * 15, formatter: function(d) { return self.formatTime(d) } }, { name: 'minute', seconds: 60, formatter: function(d) { return d.getMinutes() } }, { name: '15 second', seconds: 15, formatter: function(d) { return d.getSeconds() + 's' } }, { name: 'second', seconds: 1, formatter: function(d) { return d.getSeconds() + 's' } }, { name: 'decisecond', seconds: 1/10, formatter: function(d) { return d.getMilliseconds() + 'ms' } }, { name: 'centisecond', seconds: 1/100, formatter: function(d) { return d.getMilliseconds() + 'ms' } } ]; this.unit = function(unitName) { return this.units.filter( function(unit) { return unitName == unit.name } ).shift(); }; this.formatDate = function(d) { return d3.time.format('%b %e')(d); }; this.formatTime = function(d) { return d.toString().match(/(\d+:\d+):/)[1]; }; this.ceil = function(time, unit) { var date, floor, year; if (unit.name == 'day') { var nearFuture = new Date((time + unit.seconds - 1) * 1000); var rounded = new Date(0); rounded.setMilliseconds(0); rounded.setSeconds(0); rounded.setMinutes(0); rounded.setHours(0); rounded.setDate(nearFuture.getDate()); rounded.setMonth(nearFuture.getMonth()); rounded.setFullYear(nearFuture.getFullYear()); return rounded.getTime() / 1000; } if (unit.name == 'month') { date = new Date(time * 1000); floor = new Date(date.getFullYear(), date.getMonth()).getTime() / 1000; if (floor == time) return time; year = date.getFullYear(); var month = date.getMonth(); if (month == 11) { month = 0; year = year + 1; } else { month += 1; } return new Date(year, month).getTime() / 1000; } if (unit.name == 'year') { date = new Date(time * 1000); floor = new Date(date.getUTCFullYear(), 0).getTime() / 1000; if (floor == time) return time; year = date.getFullYear() + 1; return new Date(year, 0).getTime() / 1000; } return Math.ceil(time / unit.seconds) * unit.seconds; }; }; Rickshaw.namespace('Rickshaw.Fixtures.Number'); Rickshaw.Fixtures.Number.formatKMBT = function(y) { var abs_y = Math.abs(y); if (abs_y >= 1000000000000) { return y / 1000000000000 + "T" } else if (abs_y >= 1000000000) { return y / 1000000000 + "B" } else if (abs_y >= 1000000) { return y / 1000000 + "M" } else if (abs_y >= 1000) { return y / 1000 + "K" } else if (abs_y < 1 && y > 0) { return y.toFixed(2) } else if (abs_y === 0) { return '' } else { return y } }; Rickshaw.Fixtures.Number.formatBase1024KMGTP = function(y) { var abs_y = Math.abs(y); if (abs_y >= 1125899906842624) { return y / 1125899906842624 + "P" } else if (abs_y >= 1099511627776){ return y / 1099511627776 + "T" } else if (abs_y >= 1073741824) { return y / 1073741824 + "G" } else if (abs_y >= 1048576) { return y / 1048576 + "M" } else if (abs_y >= 1024) { return y / 1024 + "K" } else if (abs_y < 1 && y > 0) { return y.toFixed(2) } else if (abs_y === 0) { return '' } else { return y } }; Rickshaw.namespace("Rickshaw.Color.Palette"); Rickshaw.Color.Palette = function(args) { var color = new Rickshaw.Fixtures.Color(); args = args || {}; this.schemes = {}; this.scheme = color.schemes[args.scheme] || args.scheme || color.schemes.colorwheel; this.runningIndex = 0; this.generatorIndex = 0; if (args.interpolatedStopCount) { var schemeCount = this.scheme.length - 1; var i, j, scheme = []; for (i = 0; i < schemeCount; i++) { scheme.push(this.scheme[i]); var generator = d3.interpolateHsl(this.scheme[i], this.scheme[i + 1]); for (j = 1; j < args.interpolatedStopCount; j++) { scheme.push(generator((1 / args.interpolatedStopCount) * j)); } } scheme.push(this.scheme[this.scheme.length - 1]); this.scheme = scheme; } this.rotateCount = this.scheme.length; this.color = function(key) { return this.scheme[key] || this.scheme[this.runningIndex++] || this.interpolateColor() || '#808080'; }; this.interpolateColor = function() { if (!Array.isArray(this.scheme)) return; var color; if (this.generatorIndex == this.rotateCount * 2 - 1) { color = d3.interpolateHsl(this.scheme[this.generatorIndex], this.scheme[0])(0.5); this.generatorIndex = 0; this.rotateCount *= 2; } else { color = d3.interpolateHsl(this.scheme[this.generatorIndex], this.scheme[this.generatorIndex + 1])(0.5); this.generatorIndex++; } this.scheme.push(color); return color; }; }; Rickshaw.namespace('Rickshaw.Graph.Ajax'); Rickshaw.Graph.Ajax = Rickshaw.Class.create( { initialize: function(args) { this.dataURL = args.dataURL; this.onData = args.onData || function(d) { return d }; this.onComplete = args.onComplete || function() {}; this.onError = args.onError || function() {}; this.args = args; // pass through to Rickshaw.Graph this.request(); }, request: function() { $.ajax( { url: this.dataURL, dataType: 'json', success: this.success.bind(this), error: this.error.bind(this) } ); }, error: function() { console.log("error loading dataURL: " + this.dataURL); this.onError(this); }, success: function(data, status) { data = this.onData(data); this.args.series = this._splice({ data: data, series: this.args.series }); this.graph = this.graph || new Rickshaw.Graph(this.args); this.graph.render(); this.onComplete(this); }, _splice: function(args) { var data = args.data; var series = args.series; if (!args.series) return data; series.forEach( function(s) { var seriesKey = s.key || s.name; if (!seriesKey) throw "series needs a key or a name"; data.forEach( function(d) { var dataKey = d.key || d.name; if (!dataKey) throw "data needs a key or a name"; if (seriesKey == dataKey) { var properties = ['color', 'name', 'data']; properties.forEach( function(p) { if (d[p]) s[p] = d[p]; } ); } } ); } ); return series; } } ); Rickshaw.namespace('Rickshaw.Graph.Annotate'); Rickshaw.Graph.Annotate = function(args) { var graph = this.graph = args.graph; this.elements = { timeline: args.element }; var self = this; this.data = {}; this.elements.timeline.classList.add('rickshaw_annotation_timeline'); this.add = function(time, content, end_time) { self.data[time] = self.data[time] || {'boxes': []}; self.data[time].boxes.push({content: content, end: end_time}); }; this.update = function() { Rickshaw.keys(self.data).forEach( function(time) { var annotation = self.data[time]; var left = self.graph.x(time); if (left < 0 || left > self.graph.x.range()[1]) { if (annotation.element) { annotation.line.classList.add('offscreen'); annotation.element.style.display = 'none'; } annotation.boxes.forEach( function(box) { if ( box.rangeElement ) box.rangeElement.classList.add('offscreen'); }); return; } if (!annotation.element) { var element = annotation.element = document.createElement('div'); element.classList.add('annotation'); this.elements.timeline.appendChild(element); element.addEventListener('click', function(e) { element.classList.toggle('active'); annotation.line.classList.toggle('active'); annotation.boxes.forEach( function(box) { if ( box.rangeElement ) box.rangeElement.classList.toggle('active'); }); }, false); } annotation.element.style.left = left + 'px'; annotation.element.style.display = 'block'; annotation.boxes.forEach( function(box) { var element = box.element; if (!element) { element = box.element = document.createElement('div'); element.classList.add('content'); element.innerHTML = box.content; annotation.element.appendChild(element); annotation.line = document.createElement('div'); annotation.line.classList.add('annotation_line'); self.graph.element.appendChild(annotation.line); if ( box.end ) { box.rangeElement = document.createElement('div'); box.rangeElement.classList.add('annotation_range'); self.graph.element.appendChild(box.rangeElement); } } if ( box.end ) { var annotationRangeStart = left; var annotationRangeEnd = Math.min( self.graph.x(box.end), self.graph.x.range()[1] ); // annotation makes more sense at end if ( annotationRangeStart > annotationRangeEnd ) { annotationRangeEnd = left; annotationRangeStart = Math.max( self.graph.x(box.end), self.graph.x.range()[0] ); } var annotationRangeWidth = annotationRangeEnd - annotationRangeStart; box.rangeElement.style.left = annotationRangeStart + 'px'; box.rangeElement.style.width = annotationRangeWidth + 'px'; box.rangeElement.classList.remove('offscreen'); } annotation.line.classList.remove('offscreen'); annotation.line.style.left = left + 'px'; } ); }, this ); }; this.graph.onUpdate( function() { self.update() } ); }; Rickshaw.namespace('Rickshaw.Graph.Axis.Time'); Rickshaw.Graph.Axis.Time = function(args) { var self = this; this.graph = args.graph; this.elements = []; this.ticksTreatment = args.ticksTreatment || 'plain'; this.fixedTimeUnit = args.timeUnit; var time = args.timeFixture || new Rickshaw.Fixtures.Time(); this.appropriateTimeUnit = function() { var unit; var units = time.units; var domain = this.graph.x.domain(); var rangeSeconds = domain[1] - domain[0]; units.forEach( function(u) { if (Math.floor(rangeSeconds / u.seconds) >= 2) { unit = unit || u; } } ); return (unit || time.units[time.units.length - 1]); }; this.tickOffsets = function() { var domain = this.graph.x.domain(); var unit = this.fixedTimeUnit || this.appropriateTimeUnit(); var count = Math.ceil((domain[1] - domain[0]) / unit.seconds); var runningTick = domain[0]; var offsets = []; for (var i = 0; i < count; i++) { var tickValue = time.ceil(runningTick, unit); runningTick = tickValue + unit.seconds / 2; offsets.push( { value: tickValue, unit: unit } ); } return offsets; }; this.render = function() { this.elements.forEach( function(e) { e.parentNode.removeChild(e); } ); this.elements = []; var offsets = this.tickOffsets(); offsets.forEach( function(o) { if (self.graph.x(o.value) > self.graph.x.range()[1]) return; var element = document.createElement('div'); element.style.left = self.graph.x(o.value) + 'px'; element.classList.add('x_tick'); element.classList.add(self.ticksTreatment); var title = document.createElement('div'); title.classList.add('title'); title.innerHTML = o.unit.formatter(new Date(o.value * 1000)); element.appendChild(title); self.graph.element.appendChild(element); self.elements.push(element); } ); }; this.graph.onUpdate( function() { self.render() } ); }; Rickshaw.namespace('Rickshaw.Graph.Axis.X'); Rickshaw.Graph.Axis.X = function(args) { var self = this; var berthRate = 0.10; this.initialize = function(args) { this.graph = args.graph; this.orientation = args.orientation || 'top'; this.pixelsPerTick = args.pixelsPerTick || 75; if (args.ticks) this.staticTicks = args.ticks; if (args.tickValues) this.tickValues = args.tickValues; this.tickSize = args.tickSize || 4; this.ticksTreatment = args.ticksTreatment || 'plain'; if (args.element) { this.element = args.element; this._discoverSize(args.element, args); this.vis = d3.select(args.element) .append("svg:svg") .attr('height', this.height) .attr('width', this.width) .attr('class', 'rickshaw_graph x_axis_d3'); this.element = this.vis[0][0]; this.element.style.position = 'relative'; this.setSize({ width: args.width, height: args.height }); } else { this.vis = this.graph.vis; } this.graph.onUpdate( function() { self.render() } ); }; this.setSize = function(args) { args = args || {}; if (!this.element) return; this._discoverSize(this.element.parentNode, args); this.vis .attr('height', this.height) .attr('width', this.width * (1 + berthRate)); var berth = Math.floor(this.width * berthRate / 2); this.element.style.left = -1 * berth + 'px'; }; this.render = function() { if (this._renderWidth !== undefined && this.graph.width !== this._renderWidth) this.setSize({ auto: true }); var axis = d3.svg.axis().scale(this.graph.x).orient(this.orientation); axis.tickFormat( args.tickFormat || function(x) { return x } ); if (this.tickValues) axis.tickValues(this.tickValues); this.ticks = this.staticTicks || Math.floor(this.graph.width / this.pixelsPerTick); var berth = Math.floor(this.width * berthRate / 2) || 0; var transform; if (this.orientation == 'top') { var yOffset = this.height || this.graph.height; transform = 'translate(' + berth + ',' + yOffset + ')'; } else { transform = 'translate(' + berth + ', 0)'; } if (this.element) { this.vis.selectAll('*').remove(); } this.vis .append("svg:g") .attr("class", ["x_ticks_d3", this.ticksTreatment].join(" ")) .attr("transform", transform) .call(axis.ticks(this.ticks).tickSubdivide(0).tickSize(this.tickSize)); var gridSize = (this.orientation == 'bottom' ? 1 : -1) * this.graph.height; this.graph.vis .append("svg:g") .attr("class", "x_grid_d3") .call(axis.ticks(this.ticks).tickSubdivide(0).tickSize(gridSize)) .selectAll('text') .each(function() { this.parentNode.setAttribute('data-x-value', this.textContent) }); this._renderHeight = this.graph.height; }; this._discoverSize = function(element, args) { if (typeof window !== 'undefined') { var style = window.getComputedStyle(element, null); var elementHeight = parseInt(style.getPropertyValue('height'), 10); if (!args.auto) { var elementWidth = parseInt(style.getPropertyValue('width'), 10); } } this.width = (args.width || elementWidth || this.graph.width) * (1 + berthRate); this.height = args.height || elementHeight || 40; }; this.initialize(args); }; Rickshaw.namespace('Rickshaw.Graph.Axis.Y'); Rickshaw.Graph.Axis.Y = Rickshaw.Class.create( { initialize: function(args) { this.graph = args.graph; this.orientation = args.orientation || 'right'; this.pixelsPerTick = args.pixelsPerTick || 75; if (args.ticks) this.staticTicks = args.ticks; if (args.tickValues) this.tickValues = args.tickValues; this.tickSize = args.tickSize || 4; this.ticksTreatment = args.ticksTreatment || 'plain'; this.tickFormat = args.tickFormat || function(y) { return y }; this.berthRate = 0.10; if (args.element) { this.element = args.element; this.vis = d3.select(args.element) .append("svg:svg") .attr('class', 'rickshaw_graph y_axis'); this.element = this.vis[0][0]; this.element.style.position = 'relative'; this.setSize({ width: args.width, height: args.height }); } else { this.vis = this.graph.vis; } var self = this; this.graph.onUpdate( function() { self.render() } ); }, setSize: function(args) { args = args || {}; if (!this.element) return; if (typeof window !== 'undefined') { var style = window.getComputedStyle(this.element.parentNode, null); var elementWidth = parseInt(style.getPropertyValue('width'), 10); if (!args.auto) { var elementHeight = parseInt(style.getPropertyValue('height'), 10); } } this.width = args.width || elementWidth || this.graph.width * this.berthRate; this.height = args.height || elementHeight || this.graph.height; this.vis .attr('width', this.width) .attr('height', this.height * (1 + this.berthRate)); var berth = this.height * this.berthRate; if (this.orientation == 'left') { this.element.style.top = -1 * berth + 'px'; } }, render: function() { if (this._renderHeight !== undefined && this.graph.height !== this._renderHeight) this.setSize({ auto: true }); this.ticks = this.staticTicks || Math.floor(this.graph.height / this.pixelsPerTick); var axis = this._drawAxis(this.graph.y); this._drawGrid(axis); this._renderHeight = this.graph.height; }, _drawAxis: function(scale) { var axis = d3.svg.axis().scale(scale).orient(this.orientation); axis.tickFormat(this.tickFormat); if (this.tickValues) axis.tickValues(this.tickValues); if (this.orientation == 'left') { var berth = this.height * this.berthRate; var transform = 'translate(' + this.width + ', ' + berth + ')'; } if (this.element) { this.vis.selectAll('*').remove(); } this.vis .append("svg:g") .attr("class", ["y_ticks", this.ticksTreatment].join(" ")) .attr("transform", transform) .call(axis.ticks(this.ticks).tickSubdivide(0).tickSize(this.tickSize)); return axis; }, _drawGrid: function(axis) { var gridSize = (this.orientation == 'right' ? 1 : -1) * this.graph.width; this.graph.vis .append("svg:g") .attr("class", "y_grid") .call(axis.ticks(this.ticks).tickSubdivide(0).tickSize(gridSize)) .selectAll('text') .each(function() { this.parentNode.setAttribute('data-y-value', this.textContent) }); } } ); Rickshaw.namespace('Rickshaw.Graph.Axis.Y.Scaled'); Rickshaw.Graph.Axis.Y.Scaled = Rickshaw.Class.create( Rickshaw.Graph.Axis.Y, { initialize: function($super, args) { if (typeof(args.scale) === 'undefined') { throw new Error('Scaled requires scale'); } this.scale = args.scale; if (typeof(args.grid) === 'undefined') { this.grid = true; } else { this.grid = args.grid; } $super(args); }, _drawAxis: function($super, scale) { // Adjust scale's domain to compensate for adjustments to the // renderer's domain (e.g. padding). var domain = this.scale.domain(); var renderDomain = this.graph.renderer.domain().y; var extents = [ Math.min.apply(Math, domain), Math.max.apply(Math, domain)]; // A mapping from the ideal render domain [0, 1] to the extent // of the original scale's domain. This is used to calculate // the extents of the adjusted domain. var extentMap = d3.scale.linear().domain([0, 1]).range(extents); var adjExtents = [ extentMap(renderDomain[0]), extentMap(renderDomain[1])]; // A mapping from the original domain to the adjusted domain. var adjustment = d3.scale.linear().domain(extents).range(adjExtents); // Make a copy of the custom scale, apply the adjusted domain, and // copy the range to match the graph's scale. var adjustedScale = this.scale.copy() .domain(domain.map(adjustment)) .range(scale.range()); return $super(adjustedScale); }, _drawGrid: function($super, axis) { if (this.grid) { // only draw the axis if the grid option is true $super(axis); } } } ); Rickshaw.namespace('Rickshaw.Graph.Behavior.Series.Highlight'); Rickshaw.Graph.Behavior.Series.Highlight = function(args) { this.graph = args.graph; this.legend = args.legend; var self = this; var colorSafe = {}; var activeLine = null; var disabledColor = args.disabledColor || function(seriesColor) { return d3.interpolateRgb(seriesColor, d3.rgb('#d8d8d8'))(0.8).toString(); }; this.addHighlightEvents = function (l) { l.element.addEventListener( 'mouseover', function(e) { if (activeLine) return; else activeLine = l; self.legend.lines.forEach( function(line) { if (l === line) { // if we're not in a stacked renderer bring active line to the top if (self.graph.renderer.unstack && (line.series.renderer ? line.series.renderer.unstack : true)) { var seriesIndex = self.graph.series.indexOf(line.series); line.originalIndex = seriesIndex; var series = self.graph.series.splice(seriesIndex, 1)[0]; self.graph.series.push(series); } return; } colorSafe[line.series.name] = colorSafe[line.series.name] || line.series.color; line.series.color = disabledColor(line.series.color); } ); self.graph.update(); }, false ); l.element.addEventListener( 'mouseout', function(e) { if (!activeLine) return; else activeLine = null; self.legend.lines.forEach( function(line) { // return reordered series to its original place if (l === line && line.hasOwnProperty('originalIndex')) { var series = self.graph.series.pop(); self.graph.series.splice(line.originalIndex, 0, series); delete line.originalIndex; } if (colorSafe[line.series.name]) { line.series.color = colorSafe[line.series.name]; } } ); self.graph.update(); }, false ); }; if (this.legend) { this.legend.lines.forEach( function(l) { self.addHighlightEvents(l); } ); } }; Rickshaw.namespace('Rickshaw.Graph.Behavior.Series.Order'); Rickshaw.Graph.Behavior.Series.Order = function(args) { this.graph = args.graph; this.legend = args.legend; var self = this; if (typeof window.$ == 'undefined') { throw "couldn't find jQuery at window.$"; } if (typeof window.$.ui == 'undefined') { throw "couldn't find jQuery UI at window.$.ui"; } $(function() { $(self.legend.list).sortable( { containment: 'parent', tolerance: 'pointer', update: function( event, ui ) { var series = []; $(self.legend.list).find('li').each( function(index, item) { if (!item.series) return; series.push(item.series); } ); for (var i = self.graph.series.length - 1; i >= 0; i--) { self.graph.series[i] = series.shift(); } self.graph.update(); } } ); $(self.legend.list).disableSelection(); }); //hack to make jquery-ui sortable behave this.graph.onUpdate( function() { var h = window.getComputedStyle(self.legend.element).height; self.legend.element.style.height = h; } ); }; Rickshaw.namespace('Rickshaw.Graph.Behavior.Series.Toggle'); Rickshaw.Graph.Behavior.Series.Toggle = function(args) { this.graph = args.graph; this.legend = args.legend; var self = this; this.addAnchor = function(line) { var anchor = document.createElement('a'); anchor.innerHTML = '✔'; anchor.classList.add('action'); line.element.insertBefore(anchor, line.element.firstChild); anchor.onclick = function(e) { if (line.series.disabled) { line.series.enable(); line.element.classList.remove('disabled'); } else { if (this.graph.series.filter(function(s) { return !s.disabled }).length <= 1) return; line.series.disable(); line.element.classList.add('disabled'); } }.bind(this); var label = line.element.getElementsByTagName('span')[0]; label.onclick = function(e){ var disableAllOtherLines = line.series.disabled; if ( ! disableAllOtherLines ) { for ( var i = 0; i < self.legend.lines.length; i++ ) { var l = self.legend.lines[i]; if ( line.series === l.series ) { // noop } else if ( l.series.disabled ) { // noop } else { disableAllOtherLines = true; break; } } } // show all or none if ( disableAllOtherLines ) { // these must happen first or else we try ( and probably fail ) to make a no line graph line.series.enable(); line.element.classList.remove('disabled'); self.legend.lines.forEach(function(l){ if ( line.series === l.series ) { // noop } else { l.series.disable(); l.element.classList.add('disabled'); } }); } else { self.legend.lines.forEach(function(l){ l.series.enable(); l.element.classList.remove('disabled'); }); } }; }; if (this.legend) { if (typeof $ != 'undefined' && $(this.legend.list).sortable) { $(this.legend.list).sortable( { start: function(event, ui) { ui.item.bind('no.onclick', function(event) { event.preventDefault(); } ); }, stop: function(event, ui) { setTimeout(function(){ ui.item.unbind('no.onclick'); }, 250); } }); } this.legend.lines.forEach( function(l) { self.addAnchor(l); } ); } this._addBehavior = function() { this.graph.series.forEach( function(s) { s.disable = function() { if (self.graph.series.length <= 1) { throw('only one series left'); } s.disabled = true; self.graph.update(); }; s.enable = function() { s.disabled = false; self.graph.update(); }; } ); }; this._addBehavior(); this.updateBehaviour = function () { this._addBehavior() }; }; Rickshaw.namespace('Rickshaw.Graph.HoverDetail'); Rickshaw.Graph.HoverDetail = Rickshaw.Class.create({ initialize: function(args) { var graph = this.graph = args.graph; this.xFormatter = args.xFormatter || function(x) { return new Date( x * 1000 ).toUTCString(); }; this.yFormatter = args.yFormatter || function(y) { return y === null ? y : y.toFixed(2); }; var element = this.element = document.createElement('div'); element.className = 'detail'; this.visible = true; graph.element.appendChild(element); this.lastEvent = null; this._addListeners(); this.onShow = args.onShow; this.onHide = args.onHide; this.onRender = args.onRender; this.formatter = args.formatter || this.formatter; }, formatter: function(series, x, y, formattedX, formattedY, d) { return series.name + ': ' + formattedY; }, update: function(e) { e = e || this.lastEvent; if (!e) return; this.lastEvent = e; if (!e.target.nodeName.match(/^(path|svg|rect|circle)$/)) return; var graph = this.graph; var eventX = e.offsetX || e.layerX; var eventY = e.offsetY || e.layerY; var j = 0; var points = []; var nearestPoint; this.graph.series.active().forEach( function(series) { var data = this.graph.stackedData[j++]; if (!data.length) return; var domainX = graph.x.invert(eventX); var domainIndexScale = d3.scale.linear() .domain([data[0].x, data.slice(-1)[0].x]) .range([0, data.length - 1]); var approximateIndex = Math.round(domainIndexScale(domainX)); if (approximateIndex == data.length - 1) approximateIndex--; var dataIndex = Math.min(approximateIndex || 0, data.length - 1); for (var i = approximateIndex; i < data.length - 1;) { if (!data[i] || !data[i + 1]) break; if (data[i].x <= domainX && data[i + 1].x > domainX) { dataIndex = Math.abs(domainX - data[i].x) < Math.abs(domainX - data[i + 1].x) ? i : i + 1; break; } if (data[i + 1].x <= domainX) { i++ } else { i-- } } if (dataIndex < 0) dataIndex = 0; var value = data[dataIndex]; var distance = Math.sqrt( Math.pow(Math.abs(graph.x(value.x) - eventX), 2) + Math.pow(Math.abs(graph.y(value.y + value.y0) - eventY), 2) ); var xFormatter = series.xFormatter || this.xFormatter; var yFormatter = series.yFormatter || this.yFormatter; var point = { formattedXValue: xFormatter(value.x), formattedYValue: yFormatter(series.scale ? series.scale.invert(value.y) : value.y), series: series, value: value, distance: distance, order: j, name: series.name }; if (!nearestPoint || distance < nearestPoint.distance) { nearestPoint = point; } points.push(point); }, this ); if (!nearestPoint) return; nearestPoint.active = true; var domainX = nearestPoint.value.x; var formattedXValue = nearestPoint.formattedXValue; this.element.innerHTML = ''; this.element.style.left = graph.x(domainX) + 'px'; this.visible && this.render( { points: points, detail: points, // for backwards compatibility mouseX: eventX, mouseY: eventY, formattedXValue: formattedXValue, domainX: domainX } ); }, hide: function() { this.visible = false; this.element.classList.add('inactive'); if (typeof this.onHide == 'function') { this.onHide(); } }, show: function() { this.visible = true; this.element.classList.remove('inactive'); if (typeof this.onShow == 'function') { this.onShow(); } }, render: function(args) { var graph = this.graph; var points = args.points; var point = points.filter( function(p) { return p.active } ).shift(); if (point.value.y === null) return; var formattedXValue = point.formattedXValue; var formattedYValue = point.formattedYValue; this.element.innerHTML = ''; this.element.style.left = graph.x(point.value.x) + 'px'; var xLabel = document.createElement('div'); xLabel.className = 'x_label'; xLabel.innerHTML = formattedXValue; this.element.appendChild(xLabel); var item = document.createElement('div'); item.className = 'item'; // invert the scale if this series displays using a scale var series = point.series; var actualY = series.scale ? series.scale.invert(point.value.y) : point.value.y; item.innerHTML = this.formatter(series, point.value.x, actualY, formattedXValue, formattedYValue, point); item.style.top = this.graph.y(point.value.y0 + point.value.y) + 'px'; this.element.appendChild(item); var dot = document.createElement('div'); dot.className = 'dot'; dot.style.top = item.style.top; dot.style.borderColor = series.color; this.element.appendChild(dot); if (point.active) { item.classList.add('active'); dot.classList.add('active'); } // Assume left alignment until the element has been displayed and // bounding box calculations are possible. var alignables = [xLabel, item]; alignables.forEach(function(el) { el.classList.add('left'); }); this.show(); // If left-alignment results in any error, try right-alignment. var leftAlignError = this._calcLayoutError(alignables); if (leftAlignError > 0) { alignables.forEach(function(el) { el.classList.remove('left'); el.classList.add('right'); }); // If right-alignment is worse than left alignment, switch back. var rightAlignError = this._calcLayoutError(alignables); if (rightAlignError > leftAlignError) { alignables.forEach(function(el) { el.classList.remove('right'); el.classList.add('left'); }); } } if (typeof this.onRender == 'function') { this.onRender(args); } }, _calcLayoutError: function(alignables) { // Layout error is calculated as the number of linear pixels by which // an alignable extends past the left or right edge of the parent. var parentRect = this.element.parentNode.getBoundingClientRect(); var error = 0; var alignRight = alignables.forEach(function(el) { var rect = el.getBoundingClientRect(); if (!rect.width) { return; } if (rect.right > parentRect.right) { error += rect.right - parentRect.right; } if (rect.left < parentRect.left) { error += parentRect.left - rect.left; } }); return error; }, _addListeners: function() { this.graph.element.addEventListener( 'mousemove', function(e) { this.visible = true; this.update(e); }.bind(this), false ); this.graph.onUpdate( function() { this.update() }.bind(this) ); this.graph.element.addEventListener( 'mouseout', function(e) { if (e.relatedTarget && !(e.relatedTarget.compareDocumentPosition(this.graph.element) & Node.DOCUMENT_POSITION_CONTAINS)) { this.hide(); } }.bind(this), false ); } }); Rickshaw.namespace('Rickshaw.Graph.JSONP'); Rickshaw.Graph.JSONP = Rickshaw.Class.create( Rickshaw.Graph.Ajax, { request: function() { $.ajax( { url: this.dataURL, dataType: 'jsonp', success: this.success.bind(this), error: this.error.bind(this) } ); } } ); Rickshaw.namespace('Rickshaw.Graph.Legend'); Rickshaw.Graph.Legend = Rickshaw.Class.create( { className: 'rickshaw_legend', initialize: function(args) { this.element = args.element; this.graph = args.graph; this.naturalOrder = args.naturalOrder; this.element.classList.add(this.className); this.list = document.createElement('ul'); this.element.appendChild(this.list); this.render(); // we could bind this.render.bind(this) here // but triggering the re-render would lose the added // behavior of the series toggle this.graph.onUpdate( function() {} ); }, render: function() { var self = this; while ( this.list.firstChild ) { this.list.removeChild( this.list.firstChild ); } this.lines = []; var series = this.graph.series .map( function(s) { return s } ); if (!this.naturalOrder) { series = series.reverse(); } series.forEach( function(s) { self.addLine(s); } ); }, addLine: function (series) { var line = document.createElement('li'); line.className = 'line'; if (series.disabled) { line.className += ' disabled'; } if (series.className) { d3.select(line).classed(series.className, true); } var swatch = document.createElement('div'); swatch.className = 'swatch'; swatch.style.backgroundColor = series.color; line.appendChild(swatch); var label = document.createElement('span'); label.className = 'label'; label.innerHTML = series.name; line.appendChild(label); this.list.appendChild(line); line.series = series; if (series.noLegend) { line.style.display = 'none'; } var _line = { element: line, series: series }; if (this.shelving) { this.shelving.addAnchor(_line); this.shelving.updateBehaviour(); } if (this.highlighter) { this.highlighter.addHighlightEvents(_line); } this.lines.push(_line); return line; } } ); Rickshaw.namespace('Rickshaw.Graph.RangeSlider'); Rickshaw.Graph.RangeSlider = Rickshaw.Class.create({ initialize: function(args) { var element = this.element = args.element; var graph = this.graph = args.graph; this.build(); graph.onUpdate( function() { this.update() }.bind(this) ); }, build: function() { var element = this.element; var graph = this.graph; var domain = graph.dataDomain(); $( function() { $(element).slider( { range: true, min: domain[0], max: domain[1], values: [ domain[0], domain[1] ], slide: function( event, ui ) { if (ui.values[1] <= ui.values[0]) return; graph.window.xMin = ui.values[0]; graph.window.xMax = ui.values[1]; graph.update(); var domain = graph.dataDomain(); // if we're at an extreme, stick there if (domain[0] == ui.values[0]) { graph.window.xMin = undefined; } if (domain[1] == ui.values[1]) { graph.window.xMax = undefined; } } } ); } ); $(element)[0].style.width = graph.width + 'px'; }, update: function() { var element = this.element; var graph = this.graph; var values = $(element).slider('option', 'values'); var domain = graph.dataDomain(); $(element).slider('option', 'min', domain[0]); $(element).slider('option', 'max', domain[1]); if (graph.window.xMin == null) { values[0] = domain[0]; } if (graph.window.xMax == null) { values[1] = domain[1]; } $(element).slider('option', 'values', values); } }); Rickshaw.namespace('Rickshaw.Graph.RangeSlider.Preview'); Rickshaw.Graph.RangeSlider.Preview = Rickshaw.Class.create({ initialize: function(args) { if (!args.element) throw "Rickshaw.Graph.RangeSlider.Preview needs a reference to an element"; if (!args.graph && !args.graphs) throw "Rickshaw.Graph.RangeSlider.Preview needs a reference to an graph or an array of graphs"; this.element = args.element; this.graphs = args.graph ? [ args.graph ] : args.graphs; this.defaults = { height: 75, width: 400, gripperColor: undefined, frameTopThickness: 3, frameHandleThickness: 10, frameColor: "#d4d4d4", frameOpacity: 1, minimumFrameWidth: 0 }; this.defaults.gripperColor = d3.rgb(this.defaults.frameColor).darker().toString(); this.configureCallbacks = []; this.previews = []; args.width = args.width || this.graphs[0].width || this.defaults.width; args.height = args.height || this.graphs[0].height / 5 || this.defaults.height; this.configure(args); this.render(); }, onConfigure: function(callback) { this.configureCallbacks.push(callback); }, configure: function(args) { this.config = {}; this.configureCallbacks.forEach(function(callback) { callback(args); }); Rickshaw.keys(this.defaults).forEach(function(k) { this.config[k] = k in args ? args[k] : k in this.config ? this.config[k] : this.defaults[k]; }, this); if (args.width) { this.previews.forEach(function(preview) { var width = args.width - this.config.frameHandleThickness * 2; preview.setSize({ width: width }); }, this); } if (args.height) { this.previews.forEach(function(preview) { var height = this.previewHeight / this.graphs.length; preview.setSize({ height: height }); }, this); } }, render: function() { var self = this; this.svg = d3.select(this.element) .selectAll("svg.rickshaw_range_slider_preview") .data([null]); this.previewHeight = this.config.height - (this.config.frameTopThickness * 2); this.previewWidth = this.config.width - (this.config.frameHandleThickness * 2); this.currentFrame = [0, this.previewWidth]; var buildGraph = function(parent, index) { var graphArgs = Rickshaw.extend({}, parent.config); var height = self.previewHeight / self.graphs.length; Rickshaw.extend(graphArgs, { element: this.appendChild(document.createElement("div")), height: height, width: self.previewWidth, series: parent.series }); var graph = new Rickshaw.Graph(graphArgs); self.previews.push(graph); parent.onUpdate(function() { graph.render(); self.render() }); parent.onConfigure(function(args) { // don't propagate height delete args.height; graph.configure(args); graph.render(); }); graph.render(); }; var graphContainer = d3.select(this.element) .selectAll("div.rickshaw_range_slider_preview_container") .data(this.graphs); var translateCommand = "translate(" + this.config.frameHandleThickness + "px, " + this.config.frameTopThickness + "px)"; graphContainer.enter() .append("div") .classed("rickshaw_range_slider_preview_container", true) .style("-webkit-transform", translateCommand) .style("-moz-transform", translateCommand) .style("-ms-transform", translateCommand) .style("transform", translateCommand) .each(buildGraph); graphContainer.exit() .remove(); // Use the first graph as the "master" for the frame state var masterGraph = this.graphs[0]; var domainScale = d3.scale.linear() .domain([0, this.previewWidth]) .range(masterGraph.dataDomain()); var currentWindow = [masterGraph.window.xMin, masterGraph.window.xMax]; this.currentFrame[0] = currentWindow[0] === undefined ? 0 : Math.round(domainScale.invert(currentWindow[0])); if (this.currentFrame[0] < 0) this.currentFrame[0] = 0; this.currentFrame[1] = currentWindow[1] === undefined ? this.previewWidth : domainScale.invert(currentWindow[1]); if (this.currentFrame[1] - this.currentFrame[0] < self.config.minimumFrameWidth) { this.currentFrame[1] = (this.currentFrame[0] || 0) + self.config.minimumFrameWidth; } this.svg.enter() .append("svg") .classed("rickshaw_range_slider_preview", true) .style("height", this.config.height + "px") .style("width", this.config.width + "px") .style("position", "relative") .style("top", -this.previewHeight + "px"); this._renderDimming(); this._renderFrame(); this._renderGrippers(); this._renderHandles(); this._renderMiddle(); this._registerMouseEvents(); }, _renderDimming: function() { var element = this.svg .selectAll("path.dimming") .data([null]); element.enter() .append("path") .attr("fill", "white") .attr("fill-opacity", "0.7") .attr("fill-rule", "evenodd") .classed("dimming", true); var path = ""; path += " M " + this.config.frameHandleThickness + " " + this.config.frameTopThickness; path += " h " + this.previewWidth; path += " v " + this.previewHeight; path += " h " + -this.previewWidth; path += " z "; path += " M " + Math.max(this.currentFrame[0], this.config.frameHandleThickness) + " " + this.config.frameTopThickness; path += " H " + Math.min(this.currentFrame[1] + this.config.frameHandleThickness * 2, this.previewWidth + this.config.frameHandleThickness); path += " v " + this.previewHeight; path += " H " + Math.max(this.currentFrame[0], this.config.frameHandleThickness); path += " z"; element.attr("d", path); }, _renderFrame: function() { var element = this.svg .selectAll("path.frame") .data([null]); element.enter() .append("path") .attr("stroke", "white") .attr("stroke-width", "1px") .attr("stroke-linejoin", "round") .attr("fill", this.config.frameColor) .attr("fill-opacity", this.config.frameOpacity) .attr("fill-rule", "evenodd") .classed("frame", true); var path = ""; path += " M " + this.currentFrame[0] + " 0"; path += " H " + (this.currentFrame[1] + (this.config.frameHandleThickness * 2)); path += " V " + this.config.height; path += " H " + (this.currentFrame[0]); path += " z"; path += " M " + (this.currentFrame[0] + this.config.frameHandleThickness) + " " + this.config.frameTopThickness; path += " H " + (this.currentFrame[1] + this.config.frameHandleThickness); path += " v " + this.previewHeight; path += " H " + (this.currentFrame[0] + this.config.frameHandleThickness); path += " z"; element.attr("d", path); }, _renderGrippers: function() { var gripper = this.svg.selectAll("path.gripper") .data([null]); gripper.enter() .append("path") .attr("stroke", this.config.gripperColor) .classed("gripper", true); var path = ""; [0.4, 0.6].forEach(function(spacing) { path += " M " + Math.round((this.currentFrame[0] + (this.config.frameHandleThickness * spacing))) + " " + Math.round(this.config.height * 0.3); path += " V " + Math.round(this.config.height * 0.7); path += " M " + Math.round((this.currentFrame[1] + (this.config.frameHandleThickness * (1 + spacing)))) + " " + Math.round(this.config.height * 0.3); path += " V " + Math.round(this.config.height * 0.7); }.bind(this)); gripper.attr("d", path); }, _renderHandles: function() { var leftHandle = this.svg.selectAll("rect.left_handle") .data([null]); leftHandle.enter() .append("rect") .attr('width', this.config.frameHandleThickness) .attr('height', this.config.height) .style("cursor", "ew-resize") .style("fill-opacity", "0") .classed("left_handle", true); leftHandle.attr('x', this.currentFrame[0]); var rightHandle = this.svg.selectAll("rect.right_handle") .data([null]); rightHandle.enter() .append("rect") .attr('width', this.config.frameHandleThickness) .attr('height', this.config.height) .style("cursor", "ew-resize") .style("fill-opacity", "0") .classed("right_handle", true); rightHandle.attr('x', this.currentFrame[1] + this.config.frameHandleThickness); }, _renderMiddle: function() { var middleHandle = this.svg.selectAll("rect.middle_handle") .data([null]); middleHandle.enter() .append("rect") .attr('height', this.config.height) .style("cursor", "move") .style("fill-opacity", "0") .classed("middle_handle", true); middleHandle .attr('width', Math.max(0, this.currentFrame[1] - this.currentFrame[0])) .attr('x', this.currentFrame[0] + this.config.frameHandleThickness); }, _registerMouseEvents: function() { var element = d3.select(this.element); var drag = { target: null, start: null, stop: null, left: false, right: false, rigid: false }; var self = this; function onMousemove(datum, index) { drag.stop = self._getClientXFromEvent(d3.event, drag); var distanceTraveled = drag.stop - drag.start; var frameAfterDrag = self.frameBeforeDrag.slice(0); var minimumFrameWidth = self.config.minimumFrameWidth; if (drag.rigid) { minimumFrameWidth = self.frameBeforeDrag[1] - self.frameBeforeDrag[0]; } if (drag.left) { frameAfterDrag[0] = Math.max(frameAfterDrag[0] + distanceTraveled, 0); } if (drag.right) { frameAfterDrag[1] = Math.min(frameAfterDrag[1] + distanceTraveled, self.previewWidth); } var currentFrameWidth = frameAfterDrag[1] - frameAfterDrag[0]; if (currentFrameWidth <= minimumFrameWidth) { if (drag.left) { frameAfterDrag[0] = frameAfterDrag[1] - minimumFrameWidth; } if (drag.right) { frameAfterDrag[1] = frameAfterDrag[0] + minimumFrameWidth; } if (frameAfterDrag[0] <= 0) { frameAfterDrag[1] -= frameAfterDrag[0]; frameAfterDrag[0] = 0; } if (frameAfterDrag[1] >= self.previewWidth) { frameAfterDrag[0] -= (frameAfterDrag[1] - self.previewWidth); frameAfterDrag[1] = self.previewWidth; } } self.graphs.forEach(function(graph) { var domainScale = d3.scale.linear() .interpolate(d3.interpolateRound) .domain([0, self.previewWidth]) .range(graph.dataDomain()); var windowAfterDrag = [ domainScale(frameAfterDrag[0]), domainScale(frameAfterDrag[1]) ]; if (frameAfterDrag[0] === 0) { windowAfterDrag[0] = undefined; } if (frameAfterDrag[1] === self.previewWidth) { windowAfterDrag[1] = undefined; } graph.window.xMin = windowAfterDrag[0]; graph.window.xMax = windowAfterDrag[1]; graph.update(); }); } function onMousedown() { drag.target = d3.event.target; drag.start = self._getClientXFromEvent(d3.event, drag); self.frameBeforeDrag = self.currentFrame.slice(); d3.event.preventDefault ? d3.event.preventDefault() : d3.event.returnValue = false; d3.select(document).on("mousemove.rickshaw_range_slider_preview", onMousemove); d3.select(document).on("mouseup.rickshaw_range_slider_preview", onMouseup); d3.select(document).on("touchmove.rickshaw_range_slider_preview", onMousemove); d3.select(document).on("touchend.rickshaw_range_slider_preview", onMouseup); d3.select(document).on("touchcancel.rickshaw_range_slider_preview", onMouseup); } function onMousedownLeftHandle(datum, index) { drag.left = true; onMousedown(); } function onMousedownRightHandle(datum, index) { drag.right = true; onMousedown(); } function onMousedownMiddleHandle(datum, index) { drag.left = true; drag.right = true; drag.rigid = true; onMousedown(); } function onMouseup(datum, index) { d3.select(document).on("mousemove.rickshaw_range_slider_preview", null); d3.select(document).on("mouseup.rickshaw_range_slider_preview", null); d3.select(document).on("touchmove.rickshaw_range_slider_preview", null); d3.select(document).on("touchend.rickshaw_range_slider_preview", null); d3.select(document).on("touchcancel.rickshaw_range_slider_preview", null); delete self.frameBeforeDrag; drag.left = false; drag.right = false; drag.rigid = false; } element.select("rect.left_handle").on("mousedown", onMousedownLeftHandle); element.select("rect.right_handle").on("mousedown", onMousedownRightHandle); element.select("rect.middle_handle").on("mousedown", onMousedownMiddleHandle); element.select("rect.left_handle").on("touchstart", onMousedownLeftHandle); element.select("rect.right_handle").on("touchstart", onMousedownRightHandle); element.select("rect.middle_handle").on("touchstart", onMousedownMiddleHandle); }, _getClientXFromEvent: function(event, drag) { switch (event.type) { case 'touchstart': case 'touchmove': var touchList = event.changedTouches; var touch = null; for (var touchIndex = 0; touchIndex < touchList.length; touchIndex++) { if (touchList[touchIndex].target === drag.target) { touch = touchList[touchIndex]; break; } } return touch !== null ? touch.clientX : undefined; default: return event.clientX; } } }); Rickshaw.namespace("Rickshaw.Graph.Renderer"); Rickshaw.Graph.Renderer = Rickshaw.Class.create( { initialize: function(args) { this.graph = args.graph; this.tension = args.tension || this.tension; this.configure(args); }, seriesPathFactory: function() { //implement in subclass }, seriesStrokeFactory: function() { // implement in subclass }, defaults: function() { return { tension: 0.8, strokeWidth: 2, unstack: true, padding: { top: 0.01, right: 0, bottom: 0.01, left: 0 }, stroke: false, fill: false }; }, domain: function(data) { var stackedData = data || this.graph.stackedData || this.graph.stackData(); var firstPoint = stackedData[0][0]; if (firstPoint === undefined) { return { x: [null, null], y: [null, null] }; } var xMin = firstPoint.x; var xMax = firstPoint.x; var yMin = firstPoint.y + firstPoint.y0; var yMax = firstPoint.y + firstPoint.y0; stackedData.forEach( function(series) { series.forEach( function(d) { if (d.y == null) return; var y = d.y + d.y0; if (y < yMin) yMin = y; if (y > yMax) yMax = y; } ); if (!series.length) return; if (series[0].x < xMin) xMin = series[0].x; if (series[series.length - 1].x > xMax) xMax = series[series.length - 1].x; } ); xMin -= (xMax - xMin) * this.padding.left; xMax += (xMax - xMin) * this.padding.right; yMin = this.graph.min === 'auto' ? yMin : this.graph.min || 0; yMax = this.graph.max === undefined ? yMax : this.graph.max; if (this.graph.min === 'auto' || yMin < 0) { yMin -= (yMax - yMin) * this.padding.bottom; } if (this.graph.max === undefined) { yMax += (yMax - yMin) * this.padding.top; } return { x: [xMin, xMax], y: [yMin, yMax] }; }, render: function(args) { args = args || {}; var graph = this.graph; var series = args.series || graph.series; var vis = args.vis || graph.vis; vis.selectAll('*').remove(); var data = series .filter(function(s) { return !s.disabled }) .map(function(s) { return s.stack }); var pathNodes = vis.selectAll("path.path") .data(data) .enter().append("svg:path") .classed('path', true) .attr("d", this.seriesPathFactory()); if (this.stroke) { var strokeNodes = vis.selectAll('path.stroke') .data(data) .enter().append("svg:path") .classed('stroke', true) .attr("d", this.seriesStrokeFactory()); } var i = 0; series.forEach( function(series) { if (series.disabled) return; series.path = pathNodes[0][i]; if (this.stroke) series.stroke = strokeNodes[0][i]; this._styleSeries(series); i++; }, this ); }, _styleSeries: function(series) { var fill = this.fill ? series.color : 'none'; var stroke = this.stroke ? series.color : 'none'; series.path.setAttribute('fill', fill); series.path.setAttribute('stroke', stroke); series.path.setAttribute('stroke-width', this.strokeWidth); if (series.className) { d3.select(series.path).classed(series.className, true); } if (series.className && this.stroke) { d3.select(series.stroke).classed(series.className, true); } }, configure: function(args) { args = args || {}; Rickshaw.keys(this.defaults()).forEach( function(key) { if (!args.hasOwnProperty(key)) { this[key] = this[key] || this.graph[key] || this.defaults()[key]; return; } if (typeof this.defaults()[key] == 'object') { Rickshaw.keys(this.defaults()[key]).forEach( function(k) { this[key][k] = args[key][k] !== undefined ? args[key][k] : this[key][k] !== undefined ? this[key][k] : this.defaults()[key][k]; }, this ); } else { this[key] = args[key] !== undefined ? args[key] : this[key] !== undefined ? this[key] : this.graph[key] !== undefined ? this.graph[key] : this.defaults()[key]; } }, this ); }, setStrokeWidth: function(strokeWidth) { if (strokeWidth !== undefined) { this.strokeWidth = strokeWidth; } }, setTension: function(tension) { if (tension !== undefined) { this.tension = tension; } } } ); Rickshaw.namespace('Rickshaw.Graph.Renderer.Line'); Rickshaw.Graph.Renderer.Line = Rickshaw.Class.create( Rickshaw.Graph.Renderer, { name: 'line', defaults: function($super) { return Rickshaw.extend( $super(), { unstack: true, fill: false, stroke: true } ); }, seriesPathFactory: function() { var graph = this.graph; var factory = d3.svg.line() .x( function(d) { return graph.x(d.x) } ) .y( function(d) { return graph.y(d.y) } ) .interpolate(this.graph.interpolation).tension(this.tension); factory.defined && factory.defined( function(d) { return d.y !== null } ); return factory; } } ); Rickshaw.namespace('Rickshaw.Graph.Renderer.Stack'); Rickshaw.Graph.Renderer.Stack = Rickshaw.Class.create( Rickshaw.Graph.Renderer, { name: 'stack', defaults: function($super) { return Rickshaw.extend( $super(), { fill: true, stroke: false, unstack: false } ); }, seriesPathFactory: function() { var graph = this.graph; var factory = d3.svg.area() .x( function(d) { return graph.x(d.x) } ) .y0( function(d) { return graph.y(d.y0) } ) .y1( function(d) { return graph.y(d.y + d.y0) } ) .interpolate(this.graph.interpolation).tension(this.tension); factory.defined && factory.defined( function(d) { return d.y !== null } ); return factory; } } ); Rickshaw.namespace('Rickshaw.Graph.Renderer.Bar'); Rickshaw.Graph.Renderer.Bar = Rickshaw.Class.create( Rickshaw.Graph.Renderer, { name: 'bar', defaults: function($super) { var defaults = Rickshaw.extend( $super(), { gapSize: 0.05, unstack: false } ); delete defaults.tension; return defaults; }, initialize: function($super, args) { args = args || {}; this.gapSize = args.gapSize || this.gapSize; $super(args); }, domain: function($super) { var domain = $super(); var frequentInterval = this._frequentInterval(this.graph.stackedData.slice(-1).shift()); domain.x[1] += Number(frequentInterval.magnitude); return domain; }, barWidth: function(series) { var frequentInterval = this._frequentInterval(series.stack); var barWidth = this.graph.x(series.stack[0].x + frequentInterval.magnitude * (1 - this.gapSize)); return barWidth; }, render: function(args) { args = args || {}; var graph = this.graph; var series = args.series || graph.series; var vis = args.vis || graph.vis; vis.selectAll('*').remove(); var barWidth = this.barWidth(series.active()[0]); var barXOffset = 0; var activeSeriesCount = series.filter( function(s) { return !s.disabled; } ).length; var seriesBarWidth = this.unstack ? barWidth / activeSeriesCount : barWidth; var transform = function(d) { // add a matrix transform for negative values var matrix = [ 1, 0, 0, (d.y < 0 ? -1 : 1), 0, (d.y < 0 ? graph.y.magnitude(Math.abs(d.y)) * 2 : 0) ]; return "matrix(" + matrix.join(',') + ")"; }; series.forEach( function(series) { if (series.disabled) return; var barWidth = this.barWidth(series); var nodes = vis.selectAll("path") .data(series.stack.filter( function(d) { return d.y !== null } )) .enter().append("svg:rect") .attr("x", function(d) { return graph.x(d.x) + barXOffset }) .attr("y", function(d) { return (graph.y(d.y0 + Math.abs(d.y))) * (d.y < 0 ? -1 : 1 ) }) .attr("width", seriesBarWidth) .attr("height", function(d) { return graph.y.magnitude(Math.abs(d.y)) }) .attr("transform", transform); Array.prototype.forEach.call(nodes[0], function(n) { n.setAttribute('fill', series.color); } ); if (this.unstack) barXOffset += seriesBarWidth; }, this ); }, _frequentInterval: function(data) { var intervalCounts = {}; for (var i = 0; i < data.length - 1; i++) { var interval = data[i + 1].x - data[i].x; intervalCounts[interval] = intervalCounts[interval] || 0; intervalCounts[interval]++; } var frequentInterval = { count: 0, magnitude: 1 }; Rickshaw.keys(intervalCounts).forEach( function(i) { if (frequentInterval.count < intervalCounts[i]) { frequentInterval = { count: intervalCounts[i], magnitude: i }; } } ); return frequentInterval; } } ); Rickshaw.namespace('Rickshaw.Graph.Renderer.Area'); Rickshaw.Graph.Renderer.Area = Rickshaw.Class.create( Rickshaw.Graph.Renderer, { name: 'area', defaults: function($super) { return Rickshaw.extend( $super(), { unstack: false, fill: false, stroke: false } ); }, seriesPathFactory: function() { var graph = this.graph; var factory = d3.svg.area() .x( function(d) { return graph.x(d.x) } ) .y0( function(d) { return graph.y(d.y0) } ) .y1( function(d) { return graph.y(d.y + d.y0) } ) .interpolate(graph.interpolation).tension(this.tension); factory.defined && factory.defined( function(d) { return d.y !== null } ); return factory; }, seriesStrokeFactory: function() { var graph = this.graph; var factory = d3.svg.line() .x( function(d) { return graph.x(d.x) } ) .y( function(d) { return graph.y(d.y + d.y0) } ) .interpolate(graph.interpolation).tension(this.tension); factory.defined && factory.defined( function(d) { return d.y !== null } ); return factory; }, render: function(args) { args = args || {}; var graph = this.graph; var series = args.series || graph.series; var vis = args.vis || graph.vis; vis.selectAll('*').remove(); // insert or stacked areas so strokes lay on top of areas var method = this.unstack ? 'append' : 'insert'; var data = series .filter(function(s) { return !s.disabled }) .map(function(s) { return s.stack }); var nodes = vis.selectAll("path") .data(data) .enter()[method]("svg:g", 'g'); nodes.append("svg:path") .attr("d", this.seriesPathFactory()) .attr("class", 'area'); if (this.stroke) { nodes.append("svg:path") .attr("d", this.seriesStrokeFactory()) .attr("class", 'line'); } var i = 0; series.forEach( function(series) { if (series.disabled) return; series.path = nodes[0][i++]; this._styleSeries(series); }, this ); }, _styleSeries: function(series) { if (!series.path) return; d3.select(series.path).select('.area') .attr('fill', series.color); if (this.stroke) { d3.select(series.path).select('.line') .attr('fill', 'none') .attr('stroke', series.stroke || d3.interpolateRgb(series.color, 'black')(0.125)) .attr('stroke-width', this.strokeWidth); } if (series.className) { series.path.setAttribute('class', series.className); } } } ); Rickshaw.namespace('Rickshaw.Graph.Renderer.ScatterPlot'); Rickshaw.Graph.Renderer.ScatterPlot = Rickshaw.Class.create( Rickshaw.Graph.Renderer, { name: 'scatterplot', defaults: function($super) { return Rickshaw.extend( $super(), { unstack: true, fill: true, stroke: false, padding:{ top: 0.01, right: 0.01, bottom: 0.01, left: 0.01 }, dotSize: 4 } ); }, initialize: function($super, args) { $super(args); }, render: function(args) { args = args || {}; var graph = this.graph; var series = args.series || graph.series; var vis = args.vis || graph.vis; var dotSize = this.dotSize; vis.selectAll('*').remove(); series.forEach( function(series) { if (series.disabled) return; var nodes = vis.selectAll("path") .data(series.stack.filter( function(d) { return d.y !== null } )) .enter().append("svg:circle") .attr("cx", function(d) { return graph.x(d.x) }) .attr("cy", function(d) { return graph.y(d.y) }) .attr("r", function(d) { return ("r" in d) ? d.r : dotSize}); if (series.className) { nodes.classed(series.className, true); } Array.prototype.forEach.call(nodes[0], function(n) { n.setAttribute('fill', series.color); } ); }, this ); } } ); Rickshaw.namespace('Rickshaw.Graph.Renderer.Multi'); Rickshaw.Graph.Renderer.Multi = Rickshaw.Class.create( Rickshaw.Graph.Renderer, { name: 'multi', initialize: function($super, args) { $super(args); }, defaults: function($super) { return Rickshaw.extend( $super(), { unstack: true, fill: false, stroke: true } ); }, configure: function($super, args) { args = args || {}; this.config = args; $super(args); }, domain: function($super) { this.graph.stackData(); var domains = []; var groups = this._groups(); this._stack(groups); groups.forEach( function(group) { var data = group.series .filter( function(s) { return !s.disabled } ) .map( function(s) { return s.stack }); if (!data.length) return; var domain = $super(data); domains.push(domain); }); var xMin = d3.min(domains.map( function(d) { return d.x[0] } )); var xMax = d3.max(domains.map( function(d) { return d.x[1] } )); var yMin = d3.min(domains.map( function(d) { return d.y[0] } )); var yMax = d3.max(domains.map( function(d) { return d.y[1] } )); return { x: [xMin, xMax], y: [yMin, yMax] }; }, _groups: function() { var graph = this.graph; var renderGroups = {}; graph.series.forEach( function(series) { if (series.disabled) return; if (!renderGroups[series.renderer]) { var ns = "http://www.w3.org/2000/svg"; var vis = document.createElementNS(ns, 'g'); graph.vis[0][0].appendChild(vis); var renderer = graph._renderers[series.renderer]; var config = {}; var defaults = [ this.defaults(), renderer.defaults(), this.config, this.graph ]; defaults.forEach(function(d) { Rickshaw.extend(config, d) }); renderer.configure(config); renderGroups[series.renderer] = { renderer: renderer, series: [], vis: d3.select(vis) }; } renderGroups[series.renderer].series.push(series); }, this); var groups = []; Object.keys(renderGroups).forEach( function(key) { var group = renderGroups[key]; groups.push(group); }); return groups; }, _stack: function(groups) { groups.forEach( function(group) { var series = group.series .filter( function(series) { return !series.disabled } ); var data = series .map( function(series) { return series.stack } ); if (!group.renderer.unstack) { var layout = d3.layout.stack(); var stackedData = Rickshaw.clone(layout(data)); series.forEach( function(series, index) { series._stack = Rickshaw.clone(stackedData[index]); }); } }, this ); return groups; }, render: function() { this.graph.series.forEach( function(series) { if (!series.renderer) { throw new Error("Each series needs a renderer for graph 'multi' renderer"); } }); this.graph.vis.selectAll('*').remove(); var groups = this._groups(); groups = this._stack(groups); groups.forEach( function(group) { var series = group.series .filter( function(series) { return !series.disabled } ); series.active = function() { return series }; group.renderer.render({ series: series, vis: group.vis }); series.forEach(function(s) { s.stack = s._stack || s.stack || s.data; }); }); } } ); Rickshaw.namespace('Rickshaw.Graph.Renderer.LinePlot'); Rickshaw.Graph.Renderer.LinePlot = Rickshaw.Class.create( Rickshaw.Graph.Renderer, { name: 'lineplot', defaults: function($super) { return Rickshaw.extend( $super(), { unstack: true, fill: false, stroke: true, padding:{ top: 0.01, right: 0.01, bottom: 0.01, left: 0.01 }, dotSize: 3, strokeWidth: 2 } ); }, initialize: function($super, args) { $super(args); }, seriesPathFactory: function() { var graph = this.graph; var factory = d3.svg.line() .x( function(d) { return graph.x(d.x) } ) .y( function(d) { return graph.y(d.y) } ) .interpolate(this.graph.interpolation).tension(this.tension); factory.defined && factory.defined( function(d) { return d.y !== null } ); return factory; }, _renderDots: function() { var graph = this.graph; graph.series.forEach(function(series) { if (series.disabled) return; var nodes = graph.vis.selectAll("x") .data(series.stack.filter( function(d) { return d.y !== null } )) .enter().append("svg:circle") .attr("cx", function(d) { return graph.x(d.x) }) .attr("cy", function(d) { return graph.y(d.y) }) .attr("r", function(d) { return ("r" in d) ? d.r : graph.renderer.dotSize}); Array.prototype.forEach.call(nodes[0], function(n) { if (!n) return; n.setAttribute('data-color', series.color); n.setAttribute('fill', 'white'); n.setAttribute('stroke', series.color); n.setAttribute('stroke-width', this.strokeWidth); }.bind(this)); }, this); }, _renderLines: function() { var graph = this.graph; var nodes = graph.vis.selectAll("path") .data(this.graph.stackedData) .enter().append("svg:path") .attr("d", this.seriesPathFactory()); var i = 0; graph.series.forEach(function(series) { if (series.disabled) return; series.path = nodes[0][i++]; this._styleSeries(series); }, this); }, render: function() { var graph = this.graph; graph.vis.selectAll('*').remove(); this._renderLines(); this._renderDots(); } } ); Rickshaw.namespace('Rickshaw.Graph.Smoother'); Rickshaw.Graph.Smoother = Rickshaw.Class.create({ initialize: function(args) { this.graph = args.graph; this.element = args.element; this.aggregationScale = 1; this.build(); this.graph.stackData.hooks.data.push( { name: 'smoother', orderPosition: 50, f: this.transformer.bind(this) } ); }, build: function() { var self = this; if (this.element) { $( function() { $(self.element).slider( { min: 1, max: 100, slide: function( event, ui ) { self.setScale(ui.value); self.graph.update(); } } ); } ); } }, setScale: function(scale) { if (scale < 1) { throw "scale out of range: " + scale; } this.aggregationScale = scale; this.graph.update(); }, transformer: function(data) { if (this.aggregationScale == 1) return data; var aggregatedData = []; data.forEach( function(seriesData) { var aggregatedSeriesData = []; while (seriesData.length) { var avgX = 0, avgY = 0; var slice = seriesData.splice(0, this.aggregationScale); slice.forEach( function(d) { avgX += d.x / slice.length; avgY += d.y / slice.length; } ); aggregatedSeriesData.push( { x: avgX, y: avgY } ); } aggregatedData.push(aggregatedSeriesData); }.bind(this) ); return aggregatedData; } }); Rickshaw.namespace('Rickshaw.Graph.Socketio'); Rickshaw.Graph.Socketio = Rickshaw.Class.create( Rickshaw.Graph.Ajax, { request: function() { var socket = io.connect(this.dataURL); var self = this; socket.on('rickshaw', function (data) { self.success(data); }); } } ); Rickshaw.namespace('Rickshaw.Series'); Rickshaw.Series = Rickshaw.Class.create( Array, { initialize: function (data, palette, options) { options = options || {}; this.palette = new Rickshaw.Color.Palette(palette); this.timeBase = typeof(options.timeBase) === 'undefined' ? Math.floor(new Date().getTime() / 1000) : options.timeBase; var timeInterval = typeof(options.timeInterval) == 'undefined' ? 1000 : options.timeInterval; this.setTimeInterval(timeInterval); if (data && (typeof(data) == "object") && Array.isArray(data)) { data.forEach( function(item) { this.addItem(item) }, this ); } }, addItem: function(item) { if (typeof(item.name) === 'undefined') { throw('addItem() needs a name'); } item.color = (item.color || this.palette.color(item.name)); item.data = (item.data || []); // backfill, if necessary if ((item.data.length === 0) && this.length && (this.getIndex() > 0)) { this[0].data.forEach( function(plot) { item.data.push({ x: plot.x, y: 0 }); } ); } else if (item.data.length === 0) { item.data.push({ x: this.timeBase - (this.timeInterval || 0), y: 0 }); } this.push(item); if (this.legend) { this.legend.addLine(this.itemByName(item.name)); } }, addData: function(data, x) { var index = this.getIndex(); Rickshaw.keys(data).forEach( function(name) { if (! this.itemByName(name)) { this.addItem({ name: name }); } }, this ); this.forEach( function(item) { item.data.push({ x: x || (index * this.timeInterval || 1) + this.timeBase, y: (data[item.name] || 0) }); }, this ); }, getIndex: function () { return (this[0] && this[0].data && this[0].data.length) ? this[0].data.length : 0; }, itemByName: function(name) { for (var i = 0; i < this.length; i++) { if (this[i].name == name) return this[i]; } }, setTimeInterval: function(iv) { this.timeInterval = iv / 1000; }, setTimeBase: function (t) { this.timeBase = t; }, dump: function() { var data = { timeBase: this.timeBase, timeInterval: this.timeInterval, items: [] }; this.forEach( function(item) { var newItem = { color: item.color, name: item.name, data: [] }; item.data.forEach( function(plot) { newItem.data.push({ x: plot.x, y: plot.y }); } ); data.items.push(newItem); } ); return data; }, load: function(data) { if (data.timeInterval) { this.timeInterval = data.timeInterval; } if (data.timeBase) { this.timeBase = data.timeBase; } if (data.items) { data.items.forEach( function(item) { this.push(item); if (this.legend) { this.legend.addLine(this.itemByName(item.name)); } }, this ); } } } ); Rickshaw.Series.zeroFill = function(series) { Rickshaw.Series.fill(series, 0); }; Rickshaw.Series.fill = function(series, fill) { var x; var i = 0; var data = series.map( function(s) { return s.data } ); while ( i < Math.max.apply(null, data.map( function(d) { return d.length } )) ) { x = Math.min.apply( null, data .filter(function(d) { return d[i] }) .map(function(d) { return d[i].x }) ); data.forEach( function(d) { if (!d[i] || d[i].x != x) { d.splice(i, 0, { x: x, y: fill }); } } ); i++; } }; Rickshaw.namespace('Rickshaw.Series.FixedDuration'); Rickshaw.Series.FixedDuration = Rickshaw.Class.create(Rickshaw.Series, { initialize: function (data, palette, options) { options = options || {}; if (typeof(options.timeInterval) === 'undefined') { throw new Error('FixedDuration series requires timeInterval'); } if (typeof(options.maxDataPoints) === 'undefined') { throw new Error('FixedDuration series requires maxDataPoints'); } this.palette = new Rickshaw.Color.Palette(palette); this.timeBase = typeof(options.timeBase) === 'undefined' ? Math.floor(new Date().getTime() / 1000) : options.timeBase; this.setTimeInterval(options.timeInterval); if (this[0] && this[0].data && this[0].data.length) { this.currentSize = this[0].data.length; this.currentIndex = this[0].data.length; } else { this.currentSize = 0; this.currentIndex = 0; } this.maxDataPoints = options.maxDataPoints; if (data && (typeof(data) == "object") && Array.isArray(data)) { data.forEach( function (item) { this.addItem(item) }, this ); this.currentSize += 1; this.currentIndex += 1; } // reset timeBase for zero-filled values if needed this.timeBase -= (this.maxDataPoints - this.currentSize) * this.timeInterval; // zero-fill up to maxDataPoints size if we don't have that much data yet if ((typeof(this.maxDataPoints) !== 'undefined') && (this.currentSize < this.maxDataPoints)) { for (var i = this.maxDataPoints - this.currentSize - 1; i > 1; i--) { this.currentSize += 1; this.currentIndex += 1; this.forEach( function (item) { item.data.unshift({ x: ((i-1) * this.timeInterval || 1) + this.timeBase, y: 0, i: i }); }, this ); } } }, addData: function($super, data, x) { $super(data, x); this.currentSize += 1; this.currentIndex += 1; if (this.maxDataPoints !== undefined) { while (this.currentSize > this.maxDataPoints) { this.dropData(); } } }, dropData: function() { this.forEach(function(item) { item.data.splice(0, 1); } ); this.currentSize -= 1; }, getIndex: function () { return this.currentIndex; } } ); rickshaw-1.4.6/rickshaw.min.css000066400000000000000000000136341225123340100164440ustar00rootroot00000000000000.rickshaw_graph .detail{pointer-events:none;position:absolute;top:0;z-index:2;background:rgba(0,0,0,.1);bottom:0;width:1px;transition:opacity .25s linear;-moz-transition:opacity .25s linear;-o-transition:opacity .25s linear;-webkit-transition:opacity .25s linear}.rickshaw_graph .detail.inactive{opacity:0}.rickshaw_graph .detail .item.active{opacity:1}.rickshaw_graph .detail .x_label{font-family:Arial,sans-serif;border-radius:3px;padding:6px;opacity:.5;border:1px solid #e0e0e0;font-size:12px;position:absolute;background:#fff;white-space:nowrap}.rickshaw_graph .detail .x_label.left{left:0}.rickshaw_graph .detail .x_label.right{right:0}.rickshaw_graph .detail .item{position:absolute;z-index:2;border-radius:3px;padding:.25em;font-size:12px;font-family:Arial,sans-serif;opacity:0;background:rgba(0,0,0,.4);color:#fff;border:1px solid rgba(0,0,0,.4);margin-left:1em;margin-right:1em;margin-top:-1em;white-space:nowrap}.rickshaw_graph .detail .item.left{left:0}.rickshaw_graph .detail .item.right{right:0}.rickshaw_graph .detail .item.active{opacity:1;background:rgba(0,0,0,.8)}.rickshaw_graph .detail .item:after{position:absolute;display:block;width:0;height:0;content:"";border:5px solid transparent}.rickshaw_graph .detail .item.left:after{top:1em;left:-5px;margin-top:-5px;border-right-color:rgba(0,0,0,.8);border-left-width:0}.rickshaw_graph .detail .item.right:after{top:1em;right:-5px;margin-top:-5px;border-left-color:rgba(0,0,0,.8);border-right-width:0}.rickshaw_graph .detail .dot{width:4px;height:4px;margin-left:-2px;margin-top:-2px;border-radius:5px;position:absolute;box-shadow:0 0 2px rgba(0,0,0,.6);background:#fff;border-width:2px;border-style:solid;display:none;background-clip:padding-box}.rickshaw_graph .detail .dot.active{display:block}.rickshaw_graph{position:relative}.rickshaw_graph svg{display:block;overflow:hidden}.rickshaw_graph .x_tick{position:absolute;top:0;bottom:0;width:0;border-left:1px dotted rgba(0,0,0,.2);pointer-events:none}.rickshaw_graph .x_tick .title{position:absolute;font-size:12px;font-family:Arial,sans-serif;opacity:.5;white-space:nowrap;margin-left:3px;bottom:1px}.rickshaw_annotation_timeline{height:1px;border-top:1px solid #e0e0e0;margin-top:10px;position:relative}.rickshaw_annotation_timeline .annotation{position:absolute;height:6px;width:6px;margin-left:-2px;top:-3px;border-radius:5px;background-color:rgba(0,0,0,.25)}.rickshaw_graph .annotation_line{position:absolute;top:0;bottom:-6px;width:0;border-left:2px solid rgba(0,0,0,.3);display:none}.rickshaw_graph .annotation_line.active{display:block}.rickshaw_graph .annotation_range{background:rgba(0,0,0,.1);display:none;position:absolute;top:0;bottom:-6px}.rickshaw_graph .annotation_range.active{display:block}.rickshaw_graph .annotation_range.active.offscreen{display:none}.rickshaw_annotation_timeline .annotation .content{background:#fff;color:#000;opacity:.9;padding:5px;box-shadow:0 0 2px rgba(0,0,0,.8);border-radius:3px;position:relative;z-index:20;font-size:12px;padding:6px 8px 8px;top:18px;left:-11px;width:160px;display:none;cursor:pointer}.rickshaw_annotation_timeline .annotation .content:before{content:"\25b2";position:absolute;top:-11px;color:#fff;text-shadow:0 -1px 1px rgba(0,0,0,.8)}.rickshaw_annotation_timeline .annotation.active,.rickshaw_annotation_timeline .annotation:hover{background-color:rgba(0,0,0,.8);cursor:none}.rickshaw_annotation_timeline .annotation .content:hover{z-index:50}.rickshaw_annotation_timeline .annotation.active .content{display:block}.rickshaw_annotation_timeline .annotation:hover .content{display:block;z-index:50}.rickshaw_graph .y_axis,.rickshaw_graph .x_axis_d3{fill:none}.rickshaw_graph .y_ticks .tick,.rickshaw_graph .x_ticks_d3 .tick{stroke:rgba(0,0,0,.16);stroke-width:2px;shape-rendering:crisp-edges;pointer-events:none}.rickshaw_graph .y_grid .tick,.rickshaw_graph .x_grid_d3 .tick{z-index:-1;stroke:rgba(0,0,0,.2);stroke-width:1px;stroke-dasharray:1 1}.rickshaw_graph .y_grid .tick[data-y-value="0"]{stroke-dasharray:1 0}.rickshaw_graph .y_grid path,.rickshaw_graph .x_grid_d3 path{fill:none;stroke:none}.rickshaw_graph .y_ticks path,.rickshaw_graph .x_ticks_d3 path{fill:none;stroke:gray}.rickshaw_graph .y_ticks text,.rickshaw_graph .x_ticks_d3 text{opacity:.5;font-size:12px;pointer-events:none}.rickshaw_graph .x_tick.glow .title,.rickshaw_graph .y_ticks.glow text{fill:#000;color:#000;text-shadow:-1px 1px 0 rgba(255,255,255,.1),1px -1px 0 rgba(255,255,255,.1),1px 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1),0 -1px 0 rgba(255,255,255,.1),1px 0 0 rgba(255,255,255,.1),-1px 0 0 rgba(255,255,255,.1),-1px -1px 0 rgba(255,255,255,.1)}.rickshaw_graph .x_tick.inverse .title,.rickshaw_graph .y_ticks.inverse text{fill:#fff;color:#fff;text-shadow:-1px 1px 0 rgba(0,0,0,.8),1px -1px 0 rgba(0,0,0,.8),1px 1px 0 rgba(0,0,0,.8),0 1px 0 rgba(0,0,0,.8),0 -1px 0 rgba(0,0,0,.8),1px 0 0 rgba(0,0,0,.8),-1px 0 0 rgba(0,0,0,.8),-1px -1px 0 rgba(0,0,0,.8)}.rickshaw_legend{font-family:Arial;font-size:12px;color:#fff;background:#404040;display:inline-block;padding:12px 5px;border-radius:2px;position:relative}.rickshaw_legend:hover{z-index:10}.rickshaw_legend .swatch{width:10px;height:10px;border:1px solid rgba(0,0,0,.2)}.rickshaw_legend .line{clear:both;line-height:140%;padding-right:15px}.rickshaw_legend .line .swatch{display:inline-block;margin-right:3px;border-radius:2px}.rickshaw_legend .label{margin:0;white-space:nowrap;display:inline;font-size:inherit;background-color:transparent;color:inherit;font-weight:400;line-height:normal;padding:0;text-shadow:none}.rickshaw_legend .action:hover{opacity:.6}.rickshaw_legend .action{margin-right:.2em;font-size:10px;opacity:.2;cursor:pointer;font-size:14px}.rickshaw_legend .line.disabled{opacity:.4}.rickshaw_legend ul{list-style-type:none;margin:0;padding:0;margin:2px;cursor:pointer}.rickshaw_legend li{padding:0 0 0 2px;min-width:80px;white-space:nowrap}.rickshaw_legend li:hover{background:rgba(255,255,255,.08);border-radius:3px}.rickshaw_legend li:active{background:rgba(255,255,255,.2);border-radius:3px}rickshaw-1.4.6/rickshaw.min.js000066400000000000000000002220041225123340100162610ustar00rootroot00000000000000var Rickshaw={namespace:function(namespace,obj){var parts=namespace.split(".");var parent=Rickshaw;for(var i=1,length=parts.length;i=3){if(s.data[2].xthis.window.xMax)isInRange=false;return isInRange}return true};this.onUpdate=function(callback){this.updateCallbacks.push(callback)};this.onConfigure=function(callback){this.configureCallbacks.push(callback)};this.registerRenderer=function(renderer){this._renderers=this._renderers||{};this._renderers[renderer.name]=renderer};this.configure=function(args){this.config=this.config||{};if(args.width||args.height){this.setSize(args)}Rickshaw.keys(this.defaults).forEach(function(k){this.config[k]=k in args?args[k]:k in this?this[k]:this.defaults[k]},this);Rickshaw.keys(this.config).forEach(function(k){this[k]=this.config[k]},this);var renderer=args.renderer||this.renderer&&this.renderer.name||"stack";this.setRenderer(renderer,args);this.configureCallbacks.forEach(function(callback){callback(args)})};this.setRenderer=function(r,args){if(typeof r=="function"){this.renderer=new r({graph:self});this.registerRenderer(this.renderer)}else{if(!this._renderers[r]){throw"couldn't find renderer "+r}this.renderer=this._renderers[r]}if(typeof args=="object"){this.renderer.configure(args)}};this.setSize=function(args){args=args||{};if(typeof window!==undefined){var style=window.getComputedStyle(this.element,null);var elementWidth=parseInt(style.getPropertyValue("width"),10);var elementHeight=parseInt(style.getPropertyValue("height"),10)}this.width=args.width||elementWidth||400;this.height=args.height||elementHeight||250;this.vis&&this.vis.attr("width",this.width).attr("height",this.height)};this.initialize(args)};Rickshaw.namespace("Rickshaw.Fixtures.Color");Rickshaw.Fixtures.Color=function(){this.schemes={};this.schemes.spectrum14=["#ecb796","#dc8f70","#b2a470","#92875a","#716c49","#d2ed82","#bbe468","#a1d05d","#e7cbe6","#d8aad6","#a888c2","#9dc2d3","#649eb9","#387aa3"].reverse();this.schemes.spectrum2000=["#57306f","#514c76","#646583","#738394","#6b9c7d","#84b665","#a7ca50","#bfe746","#e2f528","#fff726","#ecdd00","#d4b11d","#de8800","#de4800","#c91515","#9a0000","#7b0429","#580839","#31082b"];this.schemes.spectrum2001=["#2f243f","#3c2c55","#4a3768","#565270","#6b6b7c","#72957f","#86ad6e","#a1bc5e","#b8d954","#d3e04e","#ccad2a","#cc8412","#c1521d","#ad3821","#8a1010","#681717","#531e1e","#3d1818","#320a1b"];this.schemes.classic9=["#423d4f","#4a6860","#848f39","#a2b73c","#ddcb53","#c5a32f","#7d5836","#963b20","#7c2626","#491d37","#2f254a"].reverse();this.schemes.httpStatus={503:"#ea5029",502:"#d23f14",500:"#bf3613",410:"#efacea",409:"#e291dc",403:"#f457e8",408:"#e121d2",401:"#b92dae",405:"#f47ceb",404:"#a82a9f",400:"#b263c6",301:"#6fa024",302:"#87c32b",307:"#a0d84c",304:"#28b55c",200:"#1a4f74",206:"#27839f",201:"#52adc9",202:"#7c979f",203:"#a5b8bd",204:"#c1cdd1"};this.schemes.colorwheel=["#b5b6a9","#858772","#785f43","#96557e","#4682b4","#65b9ac","#73c03a","#cb513a"].reverse();this.schemes.cool=["#5e9d2f","#73c03a","#4682b4","#7bc3b8","#a9884e","#c1b266","#a47493","#c09fb5"];this.schemes.munin=["#00cc00","#0066b3","#ff8000","#ffcc00","#330099","#990099","#ccff00","#ff0000","#808080","#008f00","#00487d","#b35a00","#b38f00","#6b006b","#8fb300","#b30000","#bebebe","#80ff80","#80c9ff","#ffc080","#ffe680","#aa80ff","#ee00cc","#ff8080","#666600","#ffbfff","#00ffcc","#cc6699","#999900"]};Rickshaw.namespace("Rickshaw.Fixtures.RandomData");Rickshaw.Fixtures.RandomData=function(timeInterval){var addData;timeInterval=timeInterval||1;var lastRandomValue=200;var timeBase=Math.floor((new Date).getTime()/1e3);this.addData=function(data){var randomValue=Math.random()*100+15+lastRandomValue;var index=data[0].length;var counter=1;data.forEach(function(series){var randomVariance=Math.random()*20;var v=randomValue/25+counter++ +(Math.cos(index*counter*11/960)+2)*15+(Math.cos(index/7)+2)*7+(Math.cos(index/17)+2)*1;series.push({x:index*timeInterval+timeBase,y:v+randomVariance})});lastRandomValue=randomValue*.85};this.removeData=function(data){data.forEach(function(series){series.shift()});timeBase+=timeInterval}};Rickshaw.namespace("Rickshaw.Fixtures.Time");Rickshaw.Fixtures.Time=function(){var self=this;this.months=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];this.units=[{name:"decade",seconds:86400*365.25*10,formatter:function(d){return parseInt(d.getUTCFullYear()/10,10)*10}},{name:"year",seconds:86400*365.25,formatter:function(d){return d.getUTCFullYear()}},{name:"month",seconds:86400*30.5,formatter:function(d){return self.months[d.getUTCMonth()]}},{name:"week",seconds:86400*7,formatter:function(d){return self.formatDate(d)}},{name:"day",seconds:86400,formatter:function(d){return d.getUTCDate()}},{name:"6 hour",seconds:3600*6,formatter:function(d){return self.formatTime(d)}},{name:"hour",seconds:3600,formatter:function(d){return self.formatTime(d)}},{name:"15 minute",seconds:60*15,formatter:function(d){return self.formatTime(d)}},{name:"minute",seconds:60,formatter:function(d){return d.getUTCMinutes()}},{name:"15 second",seconds:15,formatter:function(d){return d.getUTCSeconds()+"s"}},{name:"second",seconds:1,formatter:function(d){return d.getUTCSeconds()+"s"}},{name:"decisecond",seconds:1/10,formatter:function(d){return d.getUTCMilliseconds()+"ms"}},{name:"centisecond",seconds:1/100,formatter:function(d){return d.getUTCMilliseconds()+"ms"}}];this.unit=function(unitName){return this.units.filter(function(unit){return unitName==unit.name}).shift()};this.formatDate=function(d){return d3.time.format("%b %e")(d)};this.formatTime=function(d){return d.toUTCString().match(/(\d+:\d+):/)[1]};this.ceil=function(time,unit){var date,floor,year;if(unit.name=="month"){date=new Date(time*1e3);floor=Date.UTC(date.getUTCFullYear(),date.getUTCMonth())/1e3;if(floor==time)return time;year=date.getUTCFullYear();var month=date.getUTCMonth();if(month==11){month=0;year=year+1}else{month+=1}return Date.UTC(year,month)/1e3}if(unit.name=="year"){date=new Date(time*1e3);floor=Date.UTC(date.getUTCFullYear(),0)/1e3;if(floor==time)return time;year=date.getUTCFullYear()+1;return Date.UTC(year,0)/1e3}return Math.ceil(time/unit.seconds)*unit.seconds}};Rickshaw.namespace("Rickshaw.Fixtures.Time.Local");Rickshaw.Fixtures.Time.Local=function(){var self=this;this.months=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];this.units=[{name:"decade",seconds:86400*365.25*10,formatter:function(d){return parseInt(d.getFullYear()/10,10)*10}},{name:"year",seconds:86400*365.25,formatter:function(d){return d.getFullYear()}},{name:"month",seconds:86400*30.5,formatter:function(d){return self.months[d.getMonth()]}},{name:"week",seconds:86400*7,formatter:function(d){return self.formatDate(d)}},{name:"day",seconds:86400,formatter:function(d){return d.getDate()}},{name:"6 hour",seconds:3600*6,formatter:function(d){return self.formatTime(d)}},{name:"hour",seconds:3600,formatter:function(d){return self.formatTime(d)}},{name:"15 minute",seconds:60*15,formatter:function(d){return self.formatTime(d)}},{name:"minute",seconds:60,formatter:function(d){return d.getMinutes()}},{name:"15 second",seconds:15,formatter:function(d){return d.getSeconds()+"s"}},{name:"second",seconds:1,formatter:function(d){return d.getSeconds()+"s"}},{name:"decisecond",seconds:1/10,formatter:function(d){return d.getMilliseconds()+"ms"}},{name:"centisecond",seconds:1/100,formatter:function(d){return d.getMilliseconds()+"ms"}}];this.unit=function(unitName){return this.units.filter(function(unit){return unitName==unit.name}).shift()};this.formatDate=function(d){return d3.time.format("%b %e")(d)};this.formatTime=function(d){return d.toString().match(/(\d+:\d+):/)[1]};this.ceil=function(time,unit){var date,floor,year;if(unit.name=="day"){var nearFuture=new Date((time+unit.seconds-1)*1e3);var rounded=new Date(0);rounded.setMilliseconds(0);rounded.setSeconds(0);rounded.setMinutes(0);rounded.setHours(0);rounded.setDate(nearFuture.getDate());rounded.setMonth(nearFuture.getMonth());rounded.setFullYear(nearFuture.getFullYear());return rounded.getTime()/1e3}if(unit.name=="month"){date=new Date(time*1e3);floor=new Date(date.getFullYear(),date.getMonth()).getTime()/1e3;if(floor==time)return time;year=date.getFullYear();var month=date.getMonth();if(month==11){month=0;year=year+1}else{month+=1}return new Date(year,month).getTime()/1e3}if(unit.name=="year"){date=new Date(time*1e3);floor=new Date(date.getUTCFullYear(),0).getTime()/1e3;if(floor==time)return time;year=date.getFullYear()+1;return new Date(year,0).getTime()/1e3}return Math.ceil(time/unit.seconds)*unit.seconds}};Rickshaw.namespace("Rickshaw.Fixtures.Number");Rickshaw.Fixtures.Number.formatKMBT=function(y){var abs_y=Math.abs(y);if(abs_y>=1e12){return y/1e12+"T"}else if(abs_y>=1e9){return y/1e9+"B"}else if(abs_y>=1e6){return y/1e6+"M"}else if(abs_y>=1e3){return y/1e3+"K"}else if(abs_y<1&&y>0){return y.toFixed(2)}else if(abs_y===0){return""}else{return y}};Rickshaw.Fixtures.Number.formatBase1024KMGTP=function(y){var abs_y=Math.abs(y);if(abs_y>=0x4000000000000){return y/0x4000000000000+"P"}else if(abs_y>=1099511627776){return y/1099511627776+"T"}else if(abs_y>=1073741824){return y/1073741824+"G"}else if(abs_y>=1048576){return y/1048576+"M"}else if(abs_y>=1024){return y/1024+"K"}else if(abs_y<1&&y>0){return y.toFixed(2)}else if(abs_y===0){return""}else{return y}};Rickshaw.namespace("Rickshaw.Color.Palette");Rickshaw.Color.Palette=function(args){var color=new Rickshaw.Fixtures.Color;args=args||{};this.schemes={};this.scheme=color.schemes[args.scheme]||args.scheme||color.schemes.colorwheel;this.runningIndex=0;this.generatorIndex=0;if(args.interpolatedStopCount){var schemeCount=this.scheme.length-1;var i,j,scheme=[];for(i=0;iself.graph.x.range()[1]){if(annotation.element){annotation.line.classList.add("offscreen");annotation.element.style.display="none"}annotation.boxes.forEach(function(box){if(box.rangeElement)box.rangeElement.classList.add("offscreen")});return}if(!annotation.element){var element=annotation.element=document.createElement("div");element.classList.add("annotation");this.elements.timeline.appendChild(element);element.addEventListener("click",function(e){element.classList.toggle("active");annotation.line.classList.toggle("active");annotation.boxes.forEach(function(box){if(box.rangeElement)box.rangeElement.classList.toggle("active")})},false)}annotation.element.style.left=left+"px";annotation.element.style.display="block";annotation.boxes.forEach(function(box){var element=box.element;if(!element){element=box.element=document.createElement("div");element.classList.add("content");element.innerHTML=box.content;annotation.element.appendChild(element);annotation.line=document.createElement("div");annotation.line.classList.add("annotation_line");self.graph.element.appendChild(annotation.line);if(box.end){box.rangeElement=document.createElement("div");box.rangeElement.classList.add("annotation_range");self.graph.element.appendChild(box.rangeElement)}}if(box.end){var annotationRangeStart=left;var annotationRangeEnd=Math.min(self.graph.x(box.end),self.graph.x.range()[1]);if(annotationRangeStart>annotationRangeEnd){annotationRangeEnd=left;annotationRangeStart=Math.max(self.graph.x(box.end),self.graph.x.range()[0])}var annotationRangeWidth=annotationRangeEnd-annotationRangeStart;box.rangeElement.style.left=annotationRangeStart+"px";box.rangeElement.style.width=annotationRangeWidth+"px";box.rangeElement.classList.remove("offscreen")}annotation.line.classList.remove("offscreen");annotation.line.style.left=left+"px"})},this)};this.graph.onUpdate(function(){self.update()})};Rickshaw.namespace("Rickshaw.Graph.Axis.Time");Rickshaw.Graph.Axis.Time=function(args){var self=this;this.graph=args.graph;this.elements=[];this.ticksTreatment=args.ticksTreatment||"plain";this.fixedTimeUnit=args.timeUnit;var time=args.timeFixture||new Rickshaw.Fixtures.Time;this.appropriateTimeUnit=function(){var unit;var units=time.units;var domain=this.graph.x.domain();var rangeSeconds=domain[1]-domain[0];units.forEach(function(u){if(Math.floor(rangeSeconds/u.seconds)>=2){unit=unit||u}});return unit||time.units[time.units.length-1]};this.tickOffsets=function(){var domain=this.graph.x.domain();var unit=this.fixedTimeUnit||this.appropriateTimeUnit();var count=Math.ceil((domain[1]-domain[0])/unit.seconds);var runningTick=domain[0];var offsets=[];for(var i=0;iself.graph.x.range()[1])return;var element=document.createElement("div");element.style.left=self.graph.x(o.value)+"px";element.classList.add("x_tick");element.classList.add(self.ticksTreatment);var title=document.createElement("div");title.classList.add("title");title.innerHTML=o.unit.formatter(new Date(o.value*1e3));element.appendChild(title);self.graph.element.appendChild(element);self.elements.push(element)})};this.graph.onUpdate(function(){self.render()})};Rickshaw.namespace("Rickshaw.Graph.Axis.X");Rickshaw.Graph.Axis.X=function(args){var self=this;var berthRate=.1;this.initialize=function(args){this.graph=args.graph;this.orientation=args.orientation||"top";this.pixelsPerTick=args.pixelsPerTick||75;if(args.ticks)this.staticTicks=args.ticks;if(args.tickValues)this.tickValues=args.tickValues;this.tickSize=args.tickSize||4;this.ticksTreatment=args.ticksTreatment||"plain";if(args.element){this.element=args.element;this._discoverSize(args.element,args);this.vis=d3.select(args.element).append("svg:svg").attr("height",this.height).attr("width",this.width).attr("class","rickshaw_graph x_axis_d3");this.element=this.vis[0][0];this.element.style.position="relative";this.setSize({width:args.width,height:args.height})}else{this.vis=this.graph.vis}this.graph.onUpdate(function(){self.render()})};this.setSize=function(args){args=args||{};if(!this.element)return;this._discoverSize(this.element.parentNode,args);this.vis.attr("height",this.height).attr("width",this.width*(1+berthRate));var berth=Math.floor(this.width*berthRate/2);this.element.style.left=-1*berth+"px"};this.render=function(){if(this._renderWidth!==undefined&&this.graph.width!==this._renderWidth)this.setSize({auto:true});var axis=d3.svg.axis().scale(this.graph.x).orient(this.orientation);axis.tickFormat(args.tickFormat||function(x){return x});if(this.tickValues)axis.tickValues(this.tickValues);this.ticks=this.staticTicks||Math.floor(this.graph.width/this.pixelsPerTick);var berth=Math.floor(this.width*berthRate/2)||0;var transform;if(this.orientation=="top"){var yOffset=this.height||this.graph.height;transform="translate("+berth+","+yOffset+")"}else{transform="translate("+berth+", 0)"}if(this.element){this.vis.selectAll("*").remove()}this.vis.append("svg:g").attr("class",["x_ticks_d3",this.ticksTreatment].join(" ")).attr("transform",transform).call(axis.ticks(this.ticks).tickSubdivide(0).tickSize(this.tickSize));var gridSize=(this.orientation=="bottom"?1:-1)*this.graph.height;this.graph.vis.append("svg:g").attr("class","x_grid_d3").call(axis.ticks(this.ticks).tickSubdivide(0).tickSize(gridSize)).selectAll("text").each(function(){this.parentNode.setAttribute("data-x-value",this.textContent)});this._renderHeight=this.graph.height};this._discoverSize=function(element,args){if(typeof window!=="undefined"){var style=window.getComputedStyle(element,null);var elementHeight=parseInt(style.getPropertyValue("height"),10);if(!args.auto){var elementWidth=parseInt(style.getPropertyValue("width"),10)}}this.width=(args.width||elementWidth||this.graph.width)*(1+berthRate);this.height=args.height||elementHeight||40};this.initialize(args)};Rickshaw.namespace("Rickshaw.Graph.Axis.Y");Rickshaw.Graph.Axis.Y=Rickshaw.Class.create({initialize:function(args){this.graph=args.graph;this.orientation=args.orientation||"right";this.pixelsPerTick=args.pixelsPerTick||75;if(args.ticks)this.staticTicks=args.ticks;if(args.tickValues)this.tickValues=args.tickValues;this.tickSize=args.tickSize||4;this.ticksTreatment=args.ticksTreatment||"plain";this.tickFormat=args.tickFormat||function(y){return y};this.berthRate=.1;if(args.element){this.element=args.element;this.vis=d3.select(args.element).append("svg:svg").attr("class","rickshaw_graph y_axis");this.element=this.vis[0][0];this.element.style.position="relative";this.setSize({width:args.width,height:args.height})}else{this.vis=this.graph.vis}var self=this;this.graph.onUpdate(function(){self.render()})},setSize:function(args){args=args||{};if(!this.element)return;if(typeof window!=="undefined"){var style=window.getComputedStyle(this.element.parentNode,null);var elementWidth=parseInt(style.getPropertyValue("width"),10);if(!args.auto){var elementHeight=parseInt(style.getPropertyValue("height"),10)}}this.width=args.width||elementWidth||this.graph.width*this.berthRate;this.height=args.height||elementHeight||this.graph.height;this.vis.attr("width",this.width).attr("height",this.height*(1+this.berthRate));var berth=this.height*this.berthRate;if(this.orientation=="left"){this.element.style.top=-1*berth+"px"}},render:function(){if(this._renderHeight!==undefined&&this.graph.height!==this._renderHeight)this.setSize({auto:true});this.ticks=this.staticTicks||Math.floor(this.graph.height/this.pixelsPerTick);var axis=this._drawAxis(this.graph.y);this._drawGrid(axis);this._renderHeight=this.graph.height},_drawAxis:function(scale){var axis=d3.svg.axis().scale(scale).orient(this.orientation);axis.tickFormat(this.tickFormat);if(this.tickValues)axis.tickValues(this.tickValues);if(this.orientation=="left"){var berth=this.height*this.berthRate;var transform="translate("+this.width+", "+berth+")"}if(this.element){this.vis.selectAll("*").remove()}this.vis.append("svg:g").attr("class",["y_ticks",this.ticksTreatment].join(" ")).attr("transform",transform).call(axis.ticks(this.ticks).tickSubdivide(0).tickSize(this.tickSize));return axis},_drawGrid:function(axis){var gridSize=(this.orientation=="right"?1:-1)*this.graph.width;this.graph.vis.append("svg:g").attr("class","y_grid").call(axis.ticks(this.ticks).tickSubdivide(0).tickSize(gridSize)).selectAll("text").each(function(){this.parentNode.setAttribute("data-y-value",this.textContent)})}});Rickshaw.namespace("Rickshaw.Graph.Axis.Y.Scaled");Rickshaw.Graph.Axis.Y.Scaled=Rickshaw.Class.create(Rickshaw.Graph.Axis.Y,{initialize:function($super,args){if(typeof args.scale==="undefined"){throw new Error("Scaled requires scale")}this.scale=args.scale;if(typeof args.grid==="undefined"){this.grid=true }else{this.grid=args.grid}$super(args)},_drawAxis:function($super,scale){var domain=this.scale.domain();var renderDomain=this.graph.renderer.domain().y;var extents=[Math.min.apply(Math,domain),Math.max.apply(Math,domain)];var extentMap=d3.scale.linear().domain([0,1]).range(extents);var adjExtents=[extentMap(renderDomain[0]),extentMap(renderDomain[1])];var adjustment=d3.scale.linear().domain(extents).range(adjExtents);var adjustedScale=this.scale.copy().domain(domain.map(adjustment)).range(scale.range());return $super(adjustedScale)},_drawGrid:function($super,axis){if(this.grid){$super(axis)}}});Rickshaw.namespace("Rickshaw.Graph.Behavior.Series.Highlight");Rickshaw.Graph.Behavior.Series.Highlight=function(args){this.graph=args.graph;this.legend=args.legend;var self=this;var colorSafe={};var activeLine=null;var disabledColor=args.disabledColor||function(seriesColor){return d3.interpolateRgb(seriesColor,d3.rgb("#d8d8d8"))(.8).toString()};this.addHighlightEvents=function(l){l.element.addEventListener("mouseover",function(e){if(activeLine)return;else activeLine=l;self.legend.lines.forEach(function(line){if(l===line){if(self.graph.renderer.unstack&&(line.series.renderer?line.series.renderer.unstack:true)){var seriesIndex=self.graph.series.indexOf(line.series);line.originalIndex=seriesIndex;var series=self.graph.series.splice(seriesIndex,1)[0];self.graph.series.push(series)}return}colorSafe[line.series.name]=colorSafe[line.series.name]||line.series.color;line.series.color=disabledColor(line.series.color)});self.graph.update()},false);l.element.addEventListener("mouseout",function(e){if(!activeLine)return;else activeLine=null;self.legend.lines.forEach(function(line){if(l===line&&line.hasOwnProperty("originalIndex")){var series=self.graph.series.pop();self.graph.series.splice(line.originalIndex,0,series);delete line.originalIndex}if(colorSafe[line.series.name]){line.series.color=colorSafe[line.series.name]}});self.graph.update()},false)};if(this.legend){this.legend.lines.forEach(function(l){self.addHighlightEvents(l)})}};Rickshaw.namespace("Rickshaw.Graph.Behavior.Series.Order");Rickshaw.Graph.Behavior.Series.Order=function(args){this.graph=args.graph;this.legend=args.legend;var self=this;if(typeof window.$=="undefined"){throw"couldn't find jQuery at window.$"}if(typeof window.$.ui=="undefined"){throw"couldn't find jQuery UI at window.$.ui"}$(function(){$(self.legend.list).sortable({containment:"parent",tolerance:"pointer",update:function(event,ui){var series=[];$(self.legend.list).find("li").each(function(index,item){if(!item.series)return;series.push(item.series)});for(var i=self.graph.series.length-1;i>=0;i--){self.graph.series[i]=series.shift()}self.graph.update()}});$(self.legend.list).disableSelection()});this.graph.onUpdate(function(){var h=window.getComputedStyle(self.legend.element).height;self.legend.element.style.height=h})};Rickshaw.namespace("Rickshaw.Graph.Behavior.Series.Toggle");Rickshaw.Graph.Behavior.Series.Toggle=function(args){this.graph=args.graph;this.legend=args.legend;var self=this;this.addAnchor=function(line){var anchor=document.createElement("a");anchor.innerHTML="✔";anchor.classList.add("action");line.element.insertBefore(anchor,line.element.firstChild);anchor.onclick=function(e){if(line.series.disabled){line.series.enable();line.element.classList.remove("disabled")}else{if(this.graph.series.filter(function(s){return!s.disabled}).length<=1)return;line.series.disable();line.element.classList.add("disabled")}}.bind(this);var label=line.element.getElementsByTagName("span")[0];label.onclick=function(e){var disableAllOtherLines=line.series.disabled;if(!disableAllOtherLines){for(var i=0;idomainX){dataIndex=Math.abs(domainX-data[i].x)0){alignables.forEach(function(el){el.classList.remove("left");el.classList.add("right")});var rightAlignError=this._calcLayoutError(alignables);if(rightAlignError>leftAlignError){alignables.forEach(function(el){el.classList.remove("right");el.classList.add("left")})}}if(typeof this.onRender=="function"){this.onRender(args)}},_calcLayoutError:function(alignables){var parentRect=this.element.parentNode.getBoundingClientRect();var error=0;var alignRight=alignables.forEach(function(el){var rect=el.getBoundingClientRect();if(!rect.width){return}if(rect.right>parentRect.right){error+=rect.right-parentRect.right}if(rect.left=self.previewWidth){frameAfterDrag[0]-=frameAfterDrag[1]-self.previewWidth;frameAfterDrag[1]=self.previewWidth}}self.graphs.forEach(function(graph){var domainScale=d3.scale.linear().interpolate(d3.interpolateRound).domain([0,self.previewWidth]).range(graph.dataDomain());var windowAfterDrag=[domainScale(frameAfterDrag[0]),domainScale(frameAfterDrag[1])];if(frameAfterDrag[0]===0){windowAfterDrag[0]=undefined}if(frameAfterDrag[1]===self.previewWidth){windowAfterDrag[1]=undefined}graph.window.xMin=windowAfterDrag[0];graph.window.xMax=windowAfterDrag[1];graph.update()})}function onMousedown(){drag.target=d3.event.target;drag.start=self._getClientXFromEvent(d3.event,drag);self.frameBeforeDrag=self.currentFrame.slice();d3.event.preventDefault?d3.event.preventDefault():d3.event.returnValue=false;d3.select(document).on("mousemove.rickshaw_range_slider_preview",onMousemove);d3.select(document).on("mouseup.rickshaw_range_slider_preview",onMouseup);d3.select(document).on("touchmove.rickshaw_range_slider_preview",onMousemove);d3.select(document).on("touchend.rickshaw_range_slider_preview",onMouseup);d3.select(document).on("touchcancel.rickshaw_range_slider_preview",onMouseup)}function onMousedownLeftHandle(datum,index){drag.left=true;onMousedown()}function onMousedownRightHandle(datum,index){drag.right=true;onMousedown()}function onMousedownMiddleHandle(datum,index){drag.left=true;drag.right=true;drag.rigid=true;onMousedown()}function onMouseup(datum,index){d3.select(document).on("mousemove.rickshaw_range_slider_preview",null);d3.select(document).on("mouseup.rickshaw_range_slider_preview",null);d3.select(document).on("touchmove.rickshaw_range_slider_preview",null);d3.select(document).on("touchend.rickshaw_range_slider_preview",null);d3.select(document).on("touchcancel.rickshaw_range_slider_preview",null);delete self.frameBeforeDrag;drag.left=false;drag.right=false;drag.rigid=false}element.select("rect.left_handle").on("mousedown",onMousedownLeftHandle);element.select("rect.right_handle").on("mousedown",onMousedownRightHandle);element.select("rect.middle_handle").on("mousedown",onMousedownMiddleHandle);element.select("rect.left_handle").on("touchstart",onMousedownLeftHandle);element.select("rect.right_handle").on("touchstart",onMousedownRightHandle);element.select("rect.middle_handle").on("touchstart",onMousedownMiddleHandle)},_getClientXFromEvent:function(event,drag){switch(event.type){case"touchstart":case"touchmove":var touchList=event.changedTouches;var touch=null;for(var touchIndex=0;touchIndexyMax)yMax=y});if(!series.length)return;if(series[0].xxMax)xMax=series[series.length-1].x});xMin-=(xMax-xMin)*this.padding.left;xMax+=(xMax-xMin)*this.padding.right;yMin=this.graph.min==="auto"?yMin:this.graph.min||0;yMax=this.graph.max===undefined?yMax:this.graph.max;if(this.graph.min==="auto"||yMin<0){yMin-=(yMax-yMin)*this.padding.bottom}if(this.graph.max===undefined){yMax+=(yMax-yMin)*this.padding.top}return{x:[xMin,xMax],y:[yMin,yMax]}},render:function(args){args=args||{};var graph=this.graph;var series=args.series||graph.series;var vis=args.vis||graph.vis;vis.selectAll("*").remove();var data=series.filter(function(s){return!s.disabled}).map(function(s){return s.stack});var pathNodes=vis.selectAll("path.path").data(data).enter().append("svg:path").classed("path",true).attr("d",this.seriesPathFactory());if(this.stroke){var strokeNodes=vis.selectAll("path.stroke").data(data).enter().append("svg:path").classed("stroke",true).attr("d",this.seriesStrokeFactory())}var i=0;series.forEach(function(series){if(series.disabled)return;series.path=pathNodes[0][i];if(this.stroke)series.stroke=strokeNodes[0][i];this._styleSeries(series);i++},this)},_styleSeries:function(series){var fill=this.fill?series.color:"none";var stroke=this.stroke?series.color:"none";series.path.setAttribute("fill",fill);series.path.setAttribute("stroke",stroke);series.path.setAttribute("stroke-width",this.strokeWidth);if(series.className){d3.select(series.path).classed(series.className,true)}if(series.className&&this.stroke){d3.select(series.stroke).classed(series.className,true)}},configure:function(args){args=args||{};Rickshaw.keys(this.defaults()).forEach(function(key){if(!args.hasOwnProperty(key)){this[key]=this[key]||this.graph[key]||this.defaults()[key];return}if(typeof this.defaults()[key]=="object"){Rickshaw.keys(this.defaults()[key]).forEach(function(k){this[key][k]=args[key][k]!==undefined?args[key][k]:this[key][k]!==undefined?this[key][k]:this.defaults()[key][k]},this)}else{this[key]=args[key]!==undefined?args[key]:this[key]!==undefined?this[key]:this.graph[key]!==undefined?this.graph[key]:this.defaults()[key]}},this)},setStrokeWidth:function(strokeWidth){if(strokeWidth!==undefined){this.strokeWidth=strokeWidth}},setTension:function(tension){if(tension!==undefined){this.tension=tension}}});Rickshaw.namespace("Rickshaw.Graph.Renderer.Line");Rickshaw.Graph.Renderer.Line=Rickshaw.Class.create(Rickshaw.Graph.Renderer,{name:"line",defaults:function($super){return Rickshaw.extend($super(),{unstack:true,fill:false,stroke:true})},seriesPathFactory:function(){var graph=this.graph;var factory=d3.svg.line().x(function(d){return graph.x(d.x)}).y(function(d){return graph.y(d.y)}).interpolate(this.graph.interpolation).tension(this.tension);factory.defined&&factory.defined(function(d){return d.y!==null});return factory}});Rickshaw.namespace("Rickshaw.Graph.Renderer.Stack");Rickshaw.Graph.Renderer.Stack=Rickshaw.Class.create(Rickshaw.Graph.Renderer,{name:"stack",defaults:function($super){return Rickshaw.extend($super(),{fill:true,stroke:false,unstack:false})},seriesPathFactory:function(){var graph=this.graph;var factory=d3.svg.area().x(function(d){return graph.x(d.x)}).y0(function(d){return graph.y(d.y0)}).y1(function(d){return graph.y(d.y+d.y0)}).interpolate(this.graph.interpolation).tension(this.tension);factory.defined&&factory.defined(function(d){return d.y!==null});return factory}});Rickshaw.namespace("Rickshaw.Graph.Renderer.Bar");Rickshaw.Graph.Renderer.Bar=Rickshaw.Class.create(Rickshaw.Graph.Renderer,{name:"bar",defaults:function($super){var defaults=Rickshaw.extend($super(),{gapSize:.05,unstack:false});delete defaults.tension;return defaults},initialize:function($super,args){args=args||{};this.gapSize=args.gapSize||this.gapSize;$super(args)},domain:function($super){var domain=$super();var frequentInterval=this._frequentInterval(this.graph.stackedData.slice(-1).shift());domain.x[1]+=Number(frequentInterval.magnitude);return domain},barWidth:function(series){var frequentInterval=this._frequentInterval(series.stack);var barWidth=this.graph.x(series.stack[0].x+frequentInterval.magnitude*(1-this.gapSize));return barWidth},render:function(args){args=args||{};var graph=this.graph;var series=args.series||graph.series;var vis=args.vis||graph.vis;vis.selectAll("*").remove();var barWidth=this.barWidth(series.active()[0]);var barXOffset=0;var activeSeriesCount=series.filter(function(s){return!s.disabled}).length;var seriesBarWidth=this.unstack?barWidth/activeSeriesCount:barWidth;var transform=function(d){var matrix=[1,0,0,d.y<0?-1:1,0,d.y<0?graph.y.magnitude(Math.abs(d.y))*2:0];return"matrix("+matrix.join(",")+")"};series.forEach(function(series){if(series.disabled)return;var barWidth=this.barWidth(series);var nodes=vis.selectAll("path").data(series.stack.filter(function(d){return d.y!==null})).enter().append("svg:rect").attr("x",function(d){return graph.x(d.x)+barXOffset}).attr("y",function(d){return graph.y(d.y0+Math.abs(d.y))*(d.y<0?-1:1)}).attr("width",seriesBarWidth).attr("height",function(d){return graph.y.magnitude(Math.abs(d.y))}).attr("transform",transform);Array.prototype.forEach.call(nodes[0],function(n){n.setAttribute("fill",series.color)});if(this.unstack)barXOffset+=seriesBarWidth},this)},_frequentInterval:function(data){var intervalCounts={};for(var i=0;i0){this[0].data.forEach(function(plot){item.data.push({x:plot.x,y:0})})}else if(item.data.length===0){item.data.push({x:this.timeBase-(this.timeInterval||0),y:0})}this.push(item);if(this.legend){this.legend.addLine(this.itemByName(item.name))}},addData:function(data,x){var index=this.getIndex();Rickshaw.keys(data).forEach(function(name){if(!this.itemByName(name)){this.addItem({name:name})}},this);this.forEach(function(item){item.data.push({x:x||(index*this.timeInterval||1)+this.timeBase,y:data[item.name]||0})},this)},getIndex:function(){return this[0]&&this[0].data&&this[0].data.length?this[0].data.length:0},itemByName:function(name){for(var i=0;i1;i--){this.currentSize+=1;this.currentIndex+=1;this.forEach(function(item){item.data.unshift({x:((i-1)*this.timeInterval||1)+this.timeBase,y:0,i:i})},this)}}},addData:function($super,data,x){$super(data,x);this.currentSize+=1;this.currentIndex+=1;if(this.maxDataPoints!==undefined){while(this.currentSize>this.maxDataPoints){this.dropData()}}},dropData:function(){this.forEach(function(item){item.data.splice(0,1)});this.currentSize-=1},getIndex:function(){return this.currentIndex}});rickshaw-1.4.6/src/000077500000000000000000000000001225123340100141155ustar00rootroot00000000000000rickshaw-1.4.6/src/css/000077500000000000000000000000001225123340100147055ustar00rootroot00000000000000rickshaw-1.4.6/src/css/detail.css000066400000000000000000000040341225123340100166620ustar00rootroot00000000000000.rickshaw_graph .detail { pointer-events: none; position: absolute; top: 0; z-index: 2; background: rgba(0, 0, 0, 0.1); bottom: 0; width: 1px; transition: opacity 0.25s linear; -moz-transition: opacity 0.25s linear; -o-transition: opacity 0.25s linear; -webkit-transition: opacity 0.25s linear; } .rickshaw_graph .detail.inactive { opacity: 0; } .rickshaw_graph .detail .item.active { opacity: 1; } .rickshaw_graph .detail .x_label { font-family: Arial, sans-serif; border-radius: 3px; padding: 6px; opacity: 0.5; border: 1px solid #e0e0e0; font-size: 12px; position: absolute; background: white; white-space: nowrap; } .rickshaw_graph .detail .x_label.left { left: 0; } .rickshaw_graph .detail .x_label.right { right: 0; } .rickshaw_graph .detail .item { position: absolute; z-index: 2; border-radius: 3px; padding: 0.25em; font-size: 12px; font-family: Arial, sans-serif; opacity: 0; background: rgba(0, 0, 0, 0.4); color: white; border: 1px solid rgba(0, 0, 0, 0.4); margin-left: 1em; margin-right: 1em; margin-top: -1em; white-space: nowrap; } .rickshaw_graph .detail .item.left { left: 0; } .rickshaw_graph .detail .item.right { right: 0; } .rickshaw_graph .detail .item.active { opacity: 1; background: rgba(0, 0, 0, 0.8); } .rickshaw_graph .detail .item:after { position: absolute; display: block; width: 0; height: 0; content: ""; border: 5px solid transparent; } .rickshaw_graph .detail .item.left:after { top: 1em; left: -5px; margin-top: -5px; border-right-color: rgba(0, 0, 0, 0.8); border-left-width: 0; } .rickshaw_graph .detail .item.right:after { top: 1em; right: -5px; margin-top: -5px; border-left-color: rgba(0, 0, 0, 0.8); border-right-width: 0; } .rickshaw_graph .detail .dot { width: 4px; height: 4px; margin-left: -2px; margin-top: -2px; border-radius: 5px; position: absolute; box-shadow: 0 0 2px rgba(0, 0, 0, 0.6); background: white; border-width: 2px; border-style: solid; display: none; background-clip: padding-box; } .rickshaw_graph .detail .dot.active { display: block; } rickshaw-1.4.6/src/css/graph.css000066400000000000000000000074021225123340100165230ustar00rootroot00000000000000/* graph */ .rickshaw_graph { position: relative; } .rickshaw_graph svg { display: block; overflow: hidden; } /* ticks */ .rickshaw_graph .x_tick { position: absolute; top: 0; bottom: 0; width: 0px; border-left: 1px dotted rgba(0, 0, 0, 0.2); pointer-events: none; } .rickshaw_graph .x_tick .title { position: absolute; font-size: 12px; font-family: Arial, sans-serif; opacity: 0.5; white-space: nowrap; margin-left: 3px; bottom: 1px; } /* annotations */ .rickshaw_annotation_timeline { height: 1px; border-top: 1px solid #e0e0e0; margin-top: 10px; position: relative; } .rickshaw_annotation_timeline .annotation { position: absolute; height: 6px; width: 6px; margin-left: -2px; top: -3px; border-radius: 5px; background-color: rgba(0, 0, 0, 0.25); } .rickshaw_graph .annotation_line { position: absolute; top: 0; bottom: -6px; width: 0px; border-left: 2px solid rgba(0, 0, 0, 0.3); display: none; } .rickshaw_graph .annotation_line.active { display: block; } .rickshaw_graph .annotation_range { background: rgba(0, 0, 0, 0.1); display: none; position: absolute; top: 0; bottom: -6px; } .rickshaw_graph .annotation_range.active { display: block; } .rickshaw_graph .annotation_range.active.offscreen { display: none; } .rickshaw_annotation_timeline .annotation .content { background: white; color: black; opacity: 0.9; padding: 5px 5px; box-shadow: 0 0 2px rgba(0, 0, 0, 0.8); border-radius: 3px; position: relative; z-index: 20; font-size: 12px; padding: 6px 8px 8px; top: 18px; left: -11px; width: 160px; display: none; cursor: pointer; } .rickshaw_annotation_timeline .annotation .content:before { content: "\25b2"; position: absolute; top: -11px; color: white; text-shadow: 0 -1px 1px rgba(0, 0, 0, 0.8); } .rickshaw_annotation_timeline .annotation.active, .rickshaw_annotation_timeline .annotation:hover { background-color: rgba(0, 0, 0, 0.8); cursor: none; } .rickshaw_annotation_timeline .annotation .content:hover { z-index: 50; } .rickshaw_annotation_timeline .annotation.active .content { display: block; } .rickshaw_annotation_timeline .annotation:hover .content { display: block; z-index: 50; } .rickshaw_graph .y_axis, .rickshaw_graph .x_axis_d3 { fill: none; } .rickshaw_graph .y_ticks .tick, .rickshaw_graph .x_ticks_d3 .tick { stroke: rgba(0, 0, 0, 0.16); stroke-width: 2px; shape-rendering: crisp-edges; pointer-events: none; } .rickshaw_graph .y_grid .tick, .rickshaw_graph .x_grid_d3 .tick { z-index: -1; stroke: rgba(0, 0, 0, 0.20); stroke-width: 1px; stroke-dasharray: 1 1; } .rickshaw_graph .y_grid .tick[data-y-value="0"] { stroke-dasharray: 1 0; } .rickshaw_graph .y_grid path, .rickshaw_graph .x_grid_d3 path { fill: none; stroke: none; } .rickshaw_graph .y_ticks path, .rickshaw_graph .x_ticks_d3 path { fill: none; stroke: #808080; } .rickshaw_graph .y_ticks text, .rickshaw_graph .x_ticks_d3 text { opacity: 0.5; font-size: 12px; pointer-events: none; } .rickshaw_graph .x_tick.glow .title, .rickshaw_graph .y_ticks.glow text { fill: black; color: black; text-shadow: -1px 1px 0 rgba(255, 255, 255, 0.1), 1px -1px 0 rgba(255, 255, 255, 0.1), 1px 1px 0 rgba(255, 255, 255, 0.1), 0px 1px 0 rgba(255, 255, 255, 0.1), 0px -1px 0 rgba(255, 255, 255, 0.1), 1px 0px 0 rgba(255, 255, 255, 0.1), -1px 0px 0 rgba(255, 255, 255, 0.1), -1px -1px 0 rgba(255, 255, 255, 0.1); } .rickshaw_graph .x_tick.inverse .title, .rickshaw_graph .y_ticks.inverse text { fill: white; color: white; text-shadow: -1px 1px 0 rgba(0, 0, 0, 0.8), 1px -1px 0 rgba(0, 0, 0, 0.8), 1px 1px 0 rgba(0, 0, 0, 0.8), 0px 1px 0 rgba(0, 0, 0, 0.8), 0px -1px 0 rgba(0, 0, 0, 0.8), 1px 0px 0 rgba(0, 0, 0, 0.8), -1px 0px 0 rgba(0, 0, 0, 0.8), -1px -1px 0 rgba(0, 0, 0, 0.8); } rickshaw-1.4.6/src/css/legend.css000066400000000000000000000024571225123340100166650ustar00rootroot00000000000000.rickshaw_legend { font-family: Arial; font-size: 12px; color: white; background: #404040; display: inline-block; padding: 12px 5px; border-radius: 2px; position: relative; } .rickshaw_legend:hover { z-index: 10; } .rickshaw_legend .swatch { width: 10px; height: 10px; border: 1px solid rgba(0, 0, 0, 0.2); } .rickshaw_legend .line { clear: both; line-height: 140%; padding-right: 15px; } .rickshaw_legend .line .swatch { display: inline-block; margin-right: 3px; border-radius: 2px; } .rickshaw_legend .label { margin: 0; white-space: nowrap; display: inline; font-size: inherit; background-color: transparent; color: inherit; font-weight: normal; line-height: normal; padding: 0px; text-shadow: none; } .rickshaw_legend .action:hover { opacity: 0.6; } .rickshaw_legend .action { margin-right: 0.2em; font-size: 10px; opacity: 0.2; cursor: pointer; font-size: 14px; } .rickshaw_legend .line.disabled { opacity: 0.4; } .rickshaw_legend ul { list-style-type: none; margin: 0; padding: 0; margin: 2px; cursor: pointer; } .rickshaw_legend li { padding: 0 0 0 2px; min-width: 80px; white-space: nowrap; } .rickshaw_legend li:hover { background: rgba(255, 255, 255, 0.08); border-radius: 3px; } .rickshaw_legend li:active { background: rgba(255, 255, 255, 0.2); border-radius: 3px; } rickshaw-1.4.6/src/js/000077500000000000000000000000001225123340100145315ustar00rootroot00000000000000rickshaw-1.4.6/src/js/Rickshaw.Class.js000066400000000000000000000144561225123340100177200ustar00rootroot00000000000000/* Adapted from https://github.com/Jakobo/PTClass */ /* Copyright (c) 2005-2010 Sam Stephenson Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /* Based on Alex Arnell's inheritance implementation. */ /** section: Language * class Class * * Manages Prototype's class-based OOP system. * * Refer to Prototype's web site for a [tutorial on classes and * inheritance](http://prototypejs.org/learn/class-inheritance). **/ (function(globalContext) { /* ------------------------------------ */ /* Import from object.js */ /* ------------------------------------ */ var _toString = Object.prototype.toString, NULL_TYPE = 'Null', UNDEFINED_TYPE = 'Undefined', BOOLEAN_TYPE = 'Boolean', NUMBER_TYPE = 'Number', STRING_TYPE = 'String', OBJECT_TYPE = 'Object', FUNCTION_CLASS = '[object Function]'; function isFunction(object) { return _toString.call(object) === FUNCTION_CLASS; } function extend(destination, source) { for (var property in source) if (source.hasOwnProperty(property)) // modify protect primitive slaughter destination[property] = source[property]; return destination; } function keys(object) { if (Type(object) !== OBJECT_TYPE) { throw new TypeError(); } var results = []; for (var property in object) { if (object.hasOwnProperty(property)) { results.push(property); } } return results; } function Type(o) { switch(o) { case null: return NULL_TYPE; case (void 0): return UNDEFINED_TYPE; } var type = typeof o; switch(type) { case 'boolean': return BOOLEAN_TYPE; case 'number': return NUMBER_TYPE; case 'string': return STRING_TYPE; } return OBJECT_TYPE; } function isUndefined(object) { return typeof object === "undefined"; } /* ------------------------------------ */ /* Import from Function.js */ /* ------------------------------------ */ var slice = Array.prototype.slice; function argumentNames(fn) { var names = fn.toString().match(/^[\s\(]*function[^(]*\(([^)]*)\)/)[1] .replace(/\/\/.*?[\r\n]|\/\*(?:.|[\r\n])*?\*\//g, '') .replace(/\s+/g, '').split(','); return names.length == 1 && !names[0] ? [] : names; } function wrap(fn, wrapper) { var __method = fn; return function() { var a = update([bind(__method, this)], arguments); return wrapper.apply(this, a); } } function update(array, args) { var arrayLength = array.length, length = args.length; while (length--) array[arrayLength + length] = args[length]; return array; } function merge(array, args) { array = slice.call(array, 0); return update(array, args); } function bind(fn, context) { if (arguments.length < 2 && isUndefined(arguments[0])) return this; var __method = fn, args = slice.call(arguments, 2); return function() { var a = merge(args, arguments); return __method.apply(context, a); } } /* ------------------------------------ */ /* Import from Prototype.js */ /* ------------------------------------ */ var emptyFunction = function(){}; var Class = (function() { // Some versions of JScript fail to enumerate over properties, names of which // correspond to non-enumerable properties in the prototype chain var IS_DONTENUM_BUGGY = (function(){ for (var p in { toString: 1 }) { // check actual property name, so that it works with augmented Object.prototype if (p === 'toString') return false; } return true; })(); function subclass() {}; function create() { var parent = null, properties = [].slice.apply(arguments); if (isFunction(properties[0])) parent = properties.shift(); function klass() { this.initialize.apply(this, arguments); } extend(klass, Class.Methods); klass.superclass = parent; klass.subclasses = []; if (parent) { subclass.prototype = parent.prototype; klass.prototype = new subclass; try { parent.subclasses.push(klass) } catch(e) {} } for (var i = 0, length = properties.length; i < length; i++) klass.addMethods(properties[i]); if (!klass.prototype.initialize) klass.prototype.initialize = emptyFunction; klass.prototype.constructor = klass; return klass; } function addMethods(source) { var ancestor = this.superclass && this.superclass.prototype, properties = keys(source); // IE6 doesn't enumerate `toString` and `valueOf` (among other built-in `Object.prototype`) properties, // Force copy if they're not Object.prototype ones. // Do not copy other Object.prototype.* for performance reasons if (IS_DONTENUM_BUGGY) { if (source.toString != Object.prototype.toString) properties.push("toString"); if (source.valueOf != Object.prototype.valueOf) properties.push("valueOf"); } for (var i = 0, length = properties.length; i < length; i++) { var property = properties[i], value = source[property]; if (ancestor && isFunction(value) && argumentNames(value)[0] == "$super") { var method = value; value = wrap((function(m) { return function() { return ancestor[m].apply(this, arguments); }; })(property), method); value.valueOf = bind(method.valueOf, method); value.toString = bind(method.toString, method); } this.prototype[property] = value; } return this; } return { create: create, Methods: { addMethods: addMethods } }; })(); if (globalContext.exports) { globalContext.exports.Class = Class; } else { globalContext.Class = Class; } })(Rickshaw); rickshaw-1.4.6/src/js/Rickshaw.Color.Palette.js000066400000000000000000000026351225123340100213220ustar00rootroot00000000000000Rickshaw.namespace("Rickshaw.Color.Palette"); Rickshaw.Color.Palette = function(args) { var color = new Rickshaw.Fixtures.Color(); args = args || {}; this.schemes = {}; this.scheme = color.schemes[args.scheme] || args.scheme || color.schemes.colorwheel; this.runningIndex = 0; this.generatorIndex = 0; if (args.interpolatedStopCount) { var schemeCount = this.scheme.length - 1; var i, j, scheme = []; for (i = 0; i < schemeCount; i++) { scheme.push(this.scheme[i]); var generator = d3.interpolateHsl(this.scheme[i], this.scheme[i + 1]); for (j = 1; j < args.interpolatedStopCount; j++) { scheme.push(generator((1 / args.interpolatedStopCount) * j)); } } scheme.push(this.scheme[this.scheme.length - 1]); this.scheme = scheme; } this.rotateCount = this.scheme.length; this.color = function(key) { return this.scheme[key] || this.scheme[this.runningIndex++] || this.interpolateColor() || '#808080'; }; this.interpolateColor = function() { if (!Array.isArray(this.scheme)) return; var color; if (this.generatorIndex == this.rotateCount * 2 - 1) { color = d3.interpolateHsl(this.scheme[this.generatorIndex], this.scheme[0])(0.5); this.generatorIndex = 0; this.rotateCount *= 2; } else { color = d3.interpolateHsl(this.scheme[this.generatorIndex], this.scheme[this.generatorIndex + 1])(0.5); this.generatorIndex++; } this.scheme.push(color); return color; }; }; rickshaw-1.4.6/src/js/Rickshaw.Compat.ClassList.js000066400000000000000000000067031225123340100217720ustar00rootroot00000000000000Rickshaw.namespace('Rickshaw.Compat.ClassList'); Rickshaw.Compat.ClassList = function() { /* adapted from http://purl.eligrey.com/github/classList.js/blob/master/classList.js */ if (typeof document !== "undefined" && !("classList" in document.createElement("a"))) { (function (view) { "use strict"; var classListProp = "classList" , protoProp = "prototype" , elemCtrProto = (view.HTMLElement || view.Element)[protoProp] , objCtr = Object , strTrim = String[protoProp].trim || function () { return this.replace(/^\s+|\s+$/g, ""); } , arrIndexOf = Array[protoProp].indexOf || function (item) { var i = 0 , len = this.length ; for (; i < len; i++) { if (i in this && this[i] === item) { return i; } } return -1; } // Vendors: please allow content code to instantiate DOMExceptions , DOMEx = function (type, message) { this.name = type; this.code = DOMException[type]; this.message = message; } , checkTokenAndGetIndex = function (classList, token) { if (token === "") { throw new DOMEx( "SYNTAX_ERR" , "An invalid or illegal string was specified" ); } if (/\s/.test(token)) { throw new DOMEx( "INVALID_CHARACTER_ERR" , "String contains an invalid character" ); } return arrIndexOf.call(classList, token); } , ClassList = function (elem) { var trimmedClasses = strTrim.call(elem.className) , classes = trimmedClasses ? trimmedClasses.split(/\s+/) : [] , i = 0 , len = classes.length ; for (; i < len; i++) { this.push(classes[i]); } this._updateClassName = function () { elem.className = this.toString(); }; } , classListProto = ClassList[protoProp] = [] , classListGetter = function () { return new ClassList(this); } ; // Most DOMException implementations don't allow calling DOMException's toString() // on non-DOMExceptions. Error's toString() is sufficient here. DOMEx[protoProp] = Error[protoProp]; classListProto.item = function (i) { return this[i] || null; }; classListProto.contains = function (token) { token += ""; return checkTokenAndGetIndex(this, token) !== -1; }; classListProto.add = function (token) { token += ""; if (checkTokenAndGetIndex(this, token) === -1) { this.push(token); this._updateClassName(); } }; classListProto.remove = function (token) { token += ""; var index = checkTokenAndGetIndex(this, token); if (index !== -1) { this.splice(index, 1); this._updateClassName(); } }; classListProto.toggle = function (token) { token += ""; if (checkTokenAndGetIndex(this, token) === -1) { this.add(token); } else { this.remove(token); } }; classListProto.toString = function () { return this.join(" "); }; if (objCtr.defineProperty) { var classListPropDesc = { get: classListGetter , enumerable: true , configurable: true }; try { objCtr.defineProperty(elemCtrProto, classListProp, classListPropDesc); } catch (ex) { // IE 8 doesn't support enumerable:true if (ex.number === -0x7FF5EC54) { classListPropDesc.enumerable = false; objCtr.defineProperty(elemCtrProto, classListProp, classListPropDesc); } } } else if (objCtr[protoProp].__defineGetter__) { elemCtrProto.__defineGetter__(classListProp, classListGetter); } }(window)); } }; if ( (typeof RICKSHAW_NO_COMPAT !== "undefined" && !RICKSHAW_NO_COMPAT) || typeof RICKSHAW_NO_COMPAT === "undefined") { new Rickshaw.Compat.ClassList(); } rickshaw-1.4.6/src/js/Rickshaw.Fixtures.Color.js000066400000000000000000000042021225123340100215250ustar00rootroot00000000000000Rickshaw.namespace('Rickshaw.Fixtures.Color'); Rickshaw.Fixtures.Color = function() { this.schemes = {}; this.schemes.spectrum14 = [ '#ecb796', '#dc8f70', '#b2a470', '#92875a', '#716c49', '#d2ed82', '#bbe468', '#a1d05d', '#e7cbe6', '#d8aad6', '#a888c2', '#9dc2d3', '#649eb9', '#387aa3' ].reverse(); this.schemes.spectrum2000 = [ '#57306f', '#514c76', '#646583', '#738394', '#6b9c7d', '#84b665', '#a7ca50', '#bfe746', '#e2f528', '#fff726', '#ecdd00', '#d4b11d', '#de8800', '#de4800', '#c91515', '#9a0000', '#7b0429', '#580839', '#31082b' ]; this.schemes.spectrum2001 = [ '#2f243f', '#3c2c55', '#4a3768', '#565270', '#6b6b7c', '#72957f', '#86ad6e', '#a1bc5e', '#b8d954', '#d3e04e', '#ccad2a', '#cc8412', '#c1521d', '#ad3821', '#8a1010', '#681717', '#531e1e', '#3d1818', '#320a1b' ]; this.schemes.classic9 = [ '#423d4f', '#4a6860', '#848f39', '#a2b73c', '#ddcb53', '#c5a32f', '#7d5836', '#963b20', '#7c2626', '#491d37', '#2f254a' ].reverse(); this.schemes.httpStatus = { 503: '#ea5029', 502: '#d23f14', 500: '#bf3613', 410: '#efacea', 409: '#e291dc', 403: '#f457e8', 408: '#e121d2', 401: '#b92dae', 405: '#f47ceb', 404: '#a82a9f', 400: '#b263c6', 301: '#6fa024', 302: '#87c32b', 307: '#a0d84c', 304: '#28b55c', 200: '#1a4f74', 206: '#27839f', 201: '#52adc9', 202: '#7c979f', 203: '#a5b8bd', 204: '#c1cdd1' }; this.schemes.colorwheel = [ '#b5b6a9', '#858772', '#785f43', '#96557e', '#4682b4', '#65b9ac', '#73c03a', '#cb513a' ].reverse(); this.schemes.cool = [ '#5e9d2f', '#73c03a', '#4682b4', '#7bc3b8', '#a9884e', '#c1b266', '#a47493', '#c09fb5' ]; this.schemes.munin = [ '#00cc00', '#0066b3', '#ff8000', '#ffcc00', '#330099', '#990099', '#ccff00', '#ff0000', '#808080', '#008f00', '#00487d', '#b35a00', '#b38f00', '#6b006b', '#8fb300', '#b30000', '#bebebe', '#80ff80', '#80c9ff', '#ffc080', '#ffe680', '#aa80ff', '#ee00cc', '#ff8080', '#666600', '#ffbfff', '#00ffcc', '#cc6699', '#999900' ]; }; rickshaw-1.4.6/src/js/Rickshaw.Fixtures.Number.js000066400000000000000000000021211225123340100216750ustar00rootroot00000000000000Rickshaw.namespace('Rickshaw.Fixtures.Number'); Rickshaw.Fixtures.Number.formatKMBT = function(y) { var abs_y = Math.abs(y); if (abs_y >= 1000000000000) { return y / 1000000000000 + "T" } else if (abs_y >= 1000000000) { return y / 1000000000 + "B" } else if (abs_y >= 1000000) { return y / 1000000 + "M" } else if (abs_y >= 1000) { return y / 1000 + "K" } else if (abs_y < 1 && y > 0) { return y.toFixed(2) } else if (abs_y === 0) { return '' } else { return y } }; Rickshaw.Fixtures.Number.formatBase1024KMGTP = function(y) { var abs_y = Math.abs(y); if (abs_y >= 1125899906842624) { return y / 1125899906842624 + "P" } else if (abs_y >= 1099511627776){ return y / 1099511627776 + "T" } else if (abs_y >= 1073741824) { return y / 1073741824 + "G" } else if (abs_y >= 1048576) { return y / 1048576 + "M" } else if (abs_y >= 1024) { return y / 1024 + "K" } else if (abs_y < 1 && y > 0) { return y.toFixed(2) } else if (abs_y === 0) { return '' } else { return y } }; rickshaw-1.4.6/src/js/Rickshaw.Fixtures.RandomData.js000066400000000000000000000016241225123340100224660ustar00rootroot00000000000000Rickshaw.namespace('Rickshaw.Fixtures.RandomData'); Rickshaw.Fixtures.RandomData = function(timeInterval) { var addData; timeInterval = timeInterval || 1; var lastRandomValue = 200; var timeBase = Math.floor(new Date().getTime() / 1000); this.addData = function(data) { var randomValue = Math.random() * 100 + 15 + lastRandomValue; var index = data[0].length; var counter = 1; data.forEach( function(series) { var randomVariance = Math.random() * 20; var v = randomValue / 25 + counter++ + (Math.cos((index * counter * 11) / 960) + 2) * 15 + (Math.cos(index / 7) + 2) * 7 + (Math.cos(index / 17) + 2) * 1; series.push( { x: (index * timeInterval) + timeBase, y: v + randomVariance } ); } ); lastRandomValue = randomValue * 0.85; }; this.removeData = function(data) { data.forEach( function(series) { series.shift(); } ); timeBase += timeInterval; }; }; rickshaw-1.4.6/src/js/Rickshaw.Fixtures.Time.Local.js000066400000000000000000000060061225123340100224020ustar00rootroot00000000000000Rickshaw.namespace('Rickshaw.Fixtures.Time.Local'); Rickshaw.Fixtures.Time.Local = function() { var self = this; this.months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']; this.units = [ { name: 'decade', seconds: 86400 * 365.25 * 10, formatter: function(d) { return (parseInt(d.getFullYear() / 10, 10) * 10) } }, { name: 'year', seconds: 86400 * 365.25, formatter: function(d) { return d.getFullYear() } }, { name: 'month', seconds: 86400 * 30.5, formatter: function(d) { return self.months[d.getMonth()] } }, { name: 'week', seconds: 86400 * 7, formatter: function(d) { return self.formatDate(d) } }, { name: 'day', seconds: 86400, formatter: function(d) { return d.getDate() } }, { name: '6 hour', seconds: 3600 * 6, formatter: function(d) { return self.formatTime(d) } }, { name: 'hour', seconds: 3600, formatter: function(d) { return self.formatTime(d) } }, { name: '15 minute', seconds: 60 * 15, formatter: function(d) { return self.formatTime(d) } }, { name: 'minute', seconds: 60, formatter: function(d) { return d.getMinutes() } }, { name: '15 second', seconds: 15, formatter: function(d) { return d.getSeconds() + 's' } }, { name: 'second', seconds: 1, formatter: function(d) { return d.getSeconds() + 's' } }, { name: 'decisecond', seconds: 1/10, formatter: function(d) { return d.getMilliseconds() + 'ms' } }, { name: 'centisecond', seconds: 1/100, formatter: function(d) { return d.getMilliseconds() + 'ms' } } ]; this.unit = function(unitName) { return this.units.filter( function(unit) { return unitName == unit.name } ).shift(); }; this.formatDate = function(d) { return d3.time.format('%b %e')(d); }; this.formatTime = function(d) { return d.toString().match(/(\d+:\d+):/)[1]; }; this.ceil = function(time, unit) { var date, floor, year; if (unit.name == 'day') { var nearFuture = new Date((time + unit.seconds - 1) * 1000); var rounded = new Date(0); rounded.setMilliseconds(0); rounded.setSeconds(0); rounded.setMinutes(0); rounded.setHours(0); rounded.setDate(nearFuture.getDate()); rounded.setMonth(nearFuture.getMonth()); rounded.setFullYear(nearFuture.getFullYear()); return rounded.getTime() / 1000; } if (unit.name == 'month') { date = new Date(time * 1000); floor = new Date(date.getFullYear(), date.getMonth()).getTime() / 1000; if (floor == time) return time; year = date.getFullYear(); var month = date.getMonth(); if (month == 11) { month = 0; year = year + 1; } else { month += 1; } return new Date(year, month).getTime() / 1000; } if (unit.name == 'year') { date = new Date(time * 1000); floor = new Date(date.getUTCFullYear(), 0).getTime() / 1000; if (floor == time) return time; year = date.getFullYear() + 1; return new Date(year, 0).getTime() / 1000; } return Math.ceil(time / unit.seconds) * unit.seconds; }; }; rickshaw-1.4.6/src/js/Rickshaw.Fixtures.Time.js000066400000000000000000000051461225123340100213550ustar00rootroot00000000000000Rickshaw.namespace('Rickshaw.Fixtures.Time'); Rickshaw.Fixtures.Time = function() { var self = this; this.months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']; this.units = [ { name: 'decade', seconds: 86400 * 365.25 * 10, formatter: function(d) { return (parseInt(d.getUTCFullYear() / 10, 10) * 10) } }, { name: 'year', seconds: 86400 * 365.25, formatter: function(d) { return d.getUTCFullYear() } }, { name: 'month', seconds: 86400 * 30.5, formatter: function(d) { return self.months[d.getUTCMonth()] } }, { name: 'week', seconds: 86400 * 7, formatter: function(d) { return self.formatDate(d) } }, { name: 'day', seconds: 86400, formatter: function(d) { return d.getUTCDate() } }, { name: '6 hour', seconds: 3600 * 6, formatter: function(d) { return self.formatTime(d) } }, { name: 'hour', seconds: 3600, formatter: function(d) { return self.formatTime(d) } }, { name: '15 minute', seconds: 60 * 15, formatter: function(d) { return self.formatTime(d) } }, { name: 'minute', seconds: 60, formatter: function(d) { return d.getUTCMinutes() } }, { name: '15 second', seconds: 15, formatter: function(d) { return d.getUTCSeconds() + 's' } }, { name: 'second', seconds: 1, formatter: function(d) { return d.getUTCSeconds() + 's' } }, { name: 'decisecond', seconds: 1/10, formatter: function(d) { return d.getUTCMilliseconds() + 'ms' } }, { name: 'centisecond', seconds: 1/100, formatter: function(d) { return d.getUTCMilliseconds() + 'ms' } } ]; this.unit = function(unitName) { return this.units.filter( function(unit) { return unitName == unit.name } ).shift(); }; this.formatDate = function(d) { return d3.time.format('%b %e')(d); }; this.formatTime = function(d) { return d.toUTCString().match(/(\d+:\d+):/)[1]; }; this.ceil = function(time, unit) { var date, floor, year; if (unit.name == 'month') { date = new Date(time * 1000); floor = Date.UTC(date.getUTCFullYear(), date.getUTCMonth()) / 1000; if (floor == time) return time; year = date.getUTCFullYear(); var month = date.getUTCMonth(); if (month == 11) { month = 0; year = year + 1; } else { month += 1; } return Date.UTC(year, month) / 1000; } if (unit.name == 'year') { date = new Date(time * 1000); floor = Date.UTC(date.getUTCFullYear(), 0) / 1000; if (floor == time) return time; year = date.getUTCFullYear() + 1; return Date.UTC(year, 0) / 1000; } return Math.ceil(time / unit.seconds) * unit.seconds; }; }; rickshaw-1.4.6/src/js/Rickshaw.Graph.Ajax.js000066400000000000000000000027161225123340100205720ustar00rootroot00000000000000Rickshaw.namespace('Rickshaw.Graph.Ajax'); Rickshaw.Graph.Ajax = Rickshaw.Class.create( { initialize: function(args) { this.dataURL = args.dataURL; this.onData = args.onData || function(d) { return d }; this.onComplete = args.onComplete || function() {}; this.onError = args.onError || function() {}; this.args = args; // pass through to Rickshaw.Graph this.request(); }, request: function() { $.ajax( { url: this.dataURL, dataType: 'json', success: this.success.bind(this), error: this.error.bind(this) } ); }, error: function() { console.log("error loading dataURL: " + this.dataURL); this.onError(this); }, success: function(data, status) { data = this.onData(data); this.args.series = this._splice({ data: data, series: this.args.series }); this.graph = this.graph || new Rickshaw.Graph(this.args); this.graph.render(); this.onComplete(this); }, _splice: function(args) { var data = args.data; var series = args.series; if (!args.series) return data; series.forEach( function(s) { var seriesKey = s.key || s.name; if (!seriesKey) throw "series needs a key or a name"; data.forEach( function(d) { var dataKey = d.key || d.name; if (!dataKey) throw "data needs a key or a name"; if (seriesKey == dataKey) { var properties = ['color', 'name', 'data']; properties.forEach( function(p) { if (d[p]) s[p] = d[p]; } ); } } ); } ); return series; } } ); rickshaw-1.4.6/src/js/Rickshaw.Graph.Annotate.js000066400000000000000000000057121225123340100214570ustar00rootroot00000000000000Rickshaw.namespace('Rickshaw.Graph.Annotate'); Rickshaw.Graph.Annotate = function(args) { var graph = this.graph = args.graph; this.elements = { timeline: args.element }; var self = this; this.data = {}; this.elements.timeline.classList.add('rickshaw_annotation_timeline'); this.add = function(time, content, end_time) { self.data[time] = self.data[time] || {'boxes': []}; self.data[time].boxes.push({content: content, end: end_time}); }; this.update = function() { Rickshaw.keys(self.data).forEach( function(time) { var annotation = self.data[time]; var left = self.graph.x(time); if (left < 0 || left > self.graph.x.range()[1]) { if (annotation.element) { annotation.line.classList.add('offscreen'); annotation.element.style.display = 'none'; } annotation.boxes.forEach( function(box) { if ( box.rangeElement ) box.rangeElement.classList.add('offscreen'); }); return; } if (!annotation.element) { var element = annotation.element = document.createElement('div'); element.classList.add('annotation'); this.elements.timeline.appendChild(element); element.addEventListener('click', function(e) { element.classList.toggle('active'); annotation.line.classList.toggle('active'); annotation.boxes.forEach( function(box) { if ( box.rangeElement ) box.rangeElement.classList.toggle('active'); }); }, false); } annotation.element.style.left = left + 'px'; annotation.element.style.display = 'block'; annotation.boxes.forEach( function(box) { var element = box.element; if (!element) { element = box.element = document.createElement('div'); element.classList.add('content'); element.innerHTML = box.content; annotation.element.appendChild(element); annotation.line = document.createElement('div'); annotation.line.classList.add('annotation_line'); self.graph.element.appendChild(annotation.line); if ( box.end ) { box.rangeElement = document.createElement('div'); box.rangeElement.classList.add('annotation_range'); self.graph.element.appendChild(box.rangeElement); } } if ( box.end ) { var annotationRangeStart = left; var annotationRangeEnd = Math.min( self.graph.x(box.end), self.graph.x.range()[1] ); // annotation makes more sense at end if ( annotationRangeStart > annotationRangeEnd ) { annotationRangeEnd = left; annotationRangeStart = Math.max( self.graph.x(box.end), self.graph.x.range()[0] ); } var annotationRangeWidth = annotationRangeEnd - annotationRangeStart; box.rangeElement.style.left = annotationRangeStart + 'px'; box.rangeElement.style.width = annotationRangeWidth + 'px'; box.rangeElement.classList.remove('offscreen'); } annotation.line.classList.remove('offscreen'); annotation.line.style.left = left + 'px'; } ); }, this ); }; this.graph.onUpdate( function() { self.update() } ); }; rickshaw-1.4.6/src/js/Rickshaw.Graph.Axis.Time.js000066400000000000000000000035631225123340100215110ustar00rootroot00000000000000Rickshaw.namespace('Rickshaw.Graph.Axis.Time'); Rickshaw.Graph.Axis.Time = function(args) { var self = this; this.graph = args.graph; this.elements = []; this.ticksTreatment = args.ticksTreatment || 'plain'; this.fixedTimeUnit = args.timeUnit; var time = args.timeFixture || new Rickshaw.Fixtures.Time(); this.appropriateTimeUnit = function() { var unit; var units = time.units; var domain = this.graph.x.domain(); var rangeSeconds = domain[1] - domain[0]; units.forEach( function(u) { if (Math.floor(rangeSeconds / u.seconds) >= 2) { unit = unit || u; } } ); return (unit || time.units[time.units.length - 1]); }; this.tickOffsets = function() { var domain = this.graph.x.domain(); var unit = this.fixedTimeUnit || this.appropriateTimeUnit(); var count = Math.ceil((domain[1] - domain[0]) / unit.seconds); var runningTick = domain[0]; var offsets = []; for (var i = 0; i < count; i++) { var tickValue = time.ceil(runningTick, unit); runningTick = tickValue + unit.seconds / 2; offsets.push( { value: tickValue, unit: unit } ); } return offsets; }; this.render = function() { this.elements.forEach( function(e) { e.parentNode.removeChild(e); } ); this.elements = []; var offsets = this.tickOffsets(); offsets.forEach( function(o) { if (self.graph.x(o.value) > self.graph.x.range()[1]) return; var element = document.createElement('div'); element.style.left = self.graph.x(o.value) + 'px'; element.classList.add('x_tick'); element.classList.add(self.ticksTreatment); var title = document.createElement('div'); title.classList.add('title'); title.innerHTML = o.unit.formatter(new Date(o.value * 1000)); element.appendChild(title); self.graph.element.appendChild(element); self.elements.push(element); } ); }; this.graph.onUpdate( function() { self.render() } ); }; rickshaw-1.4.6/src/js/Rickshaw.Graph.Axis.X.js000066400000000000000000000061701225123340100210170ustar00rootroot00000000000000Rickshaw.namespace('Rickshaw.Graph.Axis.X'); Rickshaw.Graph.Axis.X = function(args) { var self = this; var berthRate = 0.10; this.initialize = function(args) { this.graph = args.graph; this.orientation = args.orientation || 'top'; this.pixelsPerTick = args.pixelsPerTick || 75; if (args.ticks) this.staticTicks = args.ticks; if (args.tickValues) this.tickValues = args.tickValues; this.tickSize = args.tickSize || 4; this.ticksTreatment = args.ticksTreatment || 'plain'; if (args.element) { this.element = args.element; this._discoverSize(args.element, args); this.vis = d3.select(args.element) .append("svg:svg") .attr('height', this.height) .attr('width', this.width) .attr('class', 'rickshaw_graph x_axis_d3'); this.element = this.vis[0][0]; this.element.style.position = 'relative'; this.setSize({ width: args.width, height: args.height }); } else { this.vis = this.graph.vis; } this.graph.onUpdate( function() { self.render() } ); }; this.setSize = function(args) { args = args || {}; if (!this.element) return; this._discoverSize(this.element.parentNode, args); this.vis .attr('height', this.height) .attr('width', this.width * (1 + berthRate)); var berth = Math.floor(this.width * berthRate / 2); this.element.style.left = -1 * berth + 'px'; }; this.render = function() { if (this._renderWidth !== undefined && this.graph.width !== this._renderWidth) this.setSize({ auto: true }); var axis = d3.svg.axis().scale(this.graph.x).orient(this.orientation); axis.tickFormat( args.tickFormat || function(x) { return x } ); if (this.tickValues) axis.tickValues(this.tickValues); this.ticks = this.staticTicks || Math.floor(this.graph.width / this.pixelsPerTick); var berth = Math.floor(this.width * berthRate / 2) || 0; var transform; if (this.orientation == 'top') { var yOffset = this.height || this.graph.height; transform = 'translate(' + berth + ',' + yOffset + ')'; } else { transform = 'translate(' + berth + ', 0)'; } if (this.element) { this.vis.selectAll('*').remove(); } this.vis .append("svg:g") .attr("class", ["x_ticks_d3", this.ticksTreatment].join(" ")) .attr("transform", transform) .call(axis.ticks(this.ticks).tickSubdivide(0).tickSize(this.tickSize)); var gridSize = (this.orientation == 'bottom' ? 1 : -1) * this.graph.height; this.graph.vis .append("svg:g") .attr("class", "x_grid_d3") .call(axis.ticks(this.ticks).tickSubdivide(0).tickSize(gridSize)) .selectAll('text') .each(function() { this.parentNode.setAttribute('data-x-value', this.textContent) }); this._renderHeight = this.graph.height; }; this._discoverSize = function(element, args) { if (typeof window !== 'undefined') { var style = window.getComputedStyle(element, null); var elementHeight = parseInt(style.getPropertyValue('height'), 10); if (!args.auto) { var elementWidth = parseInt(style.getPropertyValue('width'), 10); } } this.width = (args.width || elementWidth || this.graph.width) * (1 + berthRate); this.height = args.height || elementHeight || 40; }; this.initialize(args); }; rickshaw-1.4.6/src/js/Rickshaw.Graph.Axis.Y.Scaled.js000066400000000000000000000032211225123340100222040ustar00rootroot00000000000000Rickshaw.namespace('Rickshaw.Graph.Axis.Y.Scaled'); Rickshaw.Graph.Axis.Y.Scaled = Rickshaw.Class.create( Rickshaw.Graph.Axis.Y, { initialize: function($super, args) { if (typeof(args.scale) === 'undefined') { throw new Error('Scaled requires scale'); } this.scale = args.scale; if (typeof(args.grid) === 'undefined') { this.grid = true; } else { this.grid = args.grid; } $super(args); }, _drawAxis: function($super, scale) { // Adjust scale's domain to compensate for adjustments to the // renderer's domain (e.g. padding). var domain = this.scale.domain(); var renderDomain = this.graph.renderer.domain().y; var extents = [ Math.min.apply(Math, domain), Math.max.apply(Math, domain)]; // A mapping from the ideal render domain [0, 1] to the extent // of the original scale's domain. This is used to calculate // the extents of the adjusted domain. var extentMap = d3.scale.linear().domain([0, 1]).range(extents); var adjExtents = [ extentMap(renderDomain[0]), extentMap(renderDomain[1])]; // A mapping from the original domain to the adjusted domain. var adjustment = d3.scale.linear().domain(extents).range(adjExtents); // Make a copy of the custom scale, apply the adjusted domain, and // copy the range to match the graph's scale. var adjustedScale = this.scale.copy() .domain(domain.map(adjustment)) .range(scale.range()); return $super(adjustedScale); }, _drawGrid: function($super, axis) { if (this.grid) { // only draw the axis if the grid option is true $super(axis); } } } ); rickshaw-1.4.6/src/js/Rickshaw.Graph.Axis.Y.js000066400000000000000000000057571225123340100210320ustar00rootroot00000000000000Rickshaw.namespace('Rickshaw.Graph.Axis.Y'); Rickshaw.Graph.Axis.Y = Rickshaw.Class.create( { initialize: function(args) { this.graph = args.graph; this.orientation = args.orientation || 'right'; this.pixelsPerTick = args.pixelsPerTick || 75; if (args.ticks) this.staticTicks = args.ticks; if (args.tickValues) this.tickValues = args.tickValues; this.tickSize = args.tickSize || 4; this.ticksTreatment = args.ticksTreatment || 'plain'; this.tickFormat = args.tickFormat || function(y) { return y }; this.berthRate = 0.10; if (args.element) { this.element = args.element; this.vis = d3.select(args.element) .append("svg:svg") .attr('class', 'rickshaw_graph y_axis'); this.element = this.vis[0][0]; this.element.style.position = 'relative'; this.setSize({ width: args.width, height: args.height }); } else { this.vis = this.graph.vis; } var self = this; this.graph.onUpdate( function() { self.render() } ); }, setSize: function(args) { args = args || {}; if (!this.element) return; if (typeof window !== 'undefined') { var style = window.getComputedStyle(this.element.parentNode, null); var elementWidth = parseInt(style.getPropertyValue('width'), 10); if (!args.auto) { var elementHeight = parseInt(style.getPropertyValue('height'), 10); } } this.width = args.width || elementWidth || this.graph.width * this.berthRate; this.height = args.height || elementHeight || this.graph.height; this.vis .attr('width', this.width) .attr('height', this.height * (1 + this.berthRate)); var berth = this.height * this.berthRate; if (this.orientation == 'left') { this.element.style.top = -1 * berth + 'px'; } }, render: function() { if (this._renderHeight !== undefined && this.graph.height !== this._renderHeight) this.setSize({ auto: true }); this.ticks = this.staticTicks || Math.floor(this.graph.height / this.pixelsPerTick); var axis = this._drawAxis(this.graph.y); this._drawGrid(axis); this._renderHeight = this.graph.height; }, _drawAxis: function(scale) { var axis = d3.svg.axis().scale(scale).orient(this.orientation); axis.tickFormat(this.tickFormat); if (this.tickValues) axis.tickValues(this.tickValues); if (this.orientation == 'left') { var berth = this.height * this.berthRate; var transform = 'translate(' + this.width + ', ' + berth + ')'; } if (this.element) { this.vis.selectAll('*').remove(); } this.vis .append("svg:g") .attr("class", ["y_ticks", this.ticksTreatment].join(" ")) .attr("transform", transform) .call(axis.ticks(this.ticks).tickSubdivide(0).tickSize(this.tickSize)); return axis; }, _drawGrid: function(axis) { var gridSize = (this.orientation == 'right' ? 1 : -1) * this.graph.width; this.graph.vis .append("svg:g") .attr("class", "y_grid") .call(axis.ticks(this.ticks).tickSubdivide(0).tickSize(gridSize)) .selectAll('text') .each(function() { this.parentNode.setAttribute('data-y-value', this.textContent) }); } } ); rickshaw-1.4.6/src/js/Rickshaw.Graph.Behavior.Series.Highlight.js000066400000000000000000000035561225123340100246100ustar00rootroot00000000000000Rickshaw.namespace('Rickshaw.Graph.Behavior.Series.Highlight'); Rickshaw.Graph.Behavior.Series.Highlight = function(args) { this.graph = args.graph; this.legend = args.legend; var self = this; var colorSafe = {}; var activeLine = null; var disabledColor = args.disabledColor || function(seriesColor) { return d3.interpolateRgb(seriesColor, d3.rgb('#d8d8d8'))(0.8).toString(); }; this.addHighlightEvents = function (l) { l.element.addEventListener( 'mouseover', function(e) { if (activeLine) return; else activeLine = l; self.legend.lines.forEach( function(line) { if (l === line) { // if we're not in a stacked renderer bring active line to the top if (self.graph.renderer.unstack && (line.series.renderer ? line.series.renderer.unstack : true)) { var seriesIndex = self.graph.series.indexOf(line.series); line.originalIndex = seriesIndex; var series = self.graph.series.splice(seriesIndex, 1)[0]; self.graph.series.push(series); } return; } colorSafe[line.series.name] = colorSafe[line.series.name] || line.series.color; line.series.color = disabledColor(line.series.color); } ); self.graph.update(); }, false ); l.element.addEventListener( 'mouseout', function(e) { if (!activeLine) return; else activeLine = null; self.legend.lines.forEach( function(line) { // return reordered series to its original place if (l === line && line.hasOwnProperty('originalIndex')) { var series = self.graph.series.pop(); self.graph.series.splice(line.originalIndex, 0, series); delete line.originalIndex; } if (colorSafe[line.series.name]) { line.series.color = colorSafe[line.series.name]; } } ); self.graph.update(); }, false ); }; if (this.legend) { this.legend.lines.forEach( function(l) { self.addHighlightEvents(l); } ); } }; rickshaw-1.4.6/src/js/Rickshaw.Graph.Behavior.Series.Order.js000066400000000000000000000020421225123340100237410ustar00rootroot00000000000000Rickshaw.namespace('Rickshaw.Graph.Behavior.Series.Order'); Rickshaw.Graph.Behavior.Series.Order = function(args) { this.graph = args.graph; this.legend = args.legend; var self = this; if (typeof window.$ == 'undefined') { throw "couldn't find jQuery at window.$"; } if (typeof window.$.ui == 'undefined') { throw "couldn't find jQuery UI at window.$.ui"; } $(function() { $(self.legend.list).sortable( { containment: 'parent', tolerance: 'pointer', update: function( event, ui ) { var series = []; $(self.legend.list).find('li').each( function(index, item) { if (!item.series) return; series.push(item.series); } ); for (var i = self.graph.series.length - 1; i >= 0; i--) { self.graph.series[i] = series.shift(); } self.graph.update(); } } ); $(self.legend.list).disableSelection(); }); //hack to make jquery-ui sortable behave this.graph.onUpdate( function() { var h = window.getComputedStyle(self.legend.element).height; self.legend.element.style.height = h; } ); }; rickshaw-1.4.6/src/js/Rickshaw.Graph.Behavior.Series.Toggle.js000066400000000000000000000072551225123340100241220ustar00rootroot00000000000000Rickshaw.namespace('Rickshaw.Graph.Behavior.Series.Toggle'); Rickshaw.Graph.Behavior.Series.Toggle = function(args) { this.graph = args.graph; this.legend = args.legend; var self = this; this.addAnchor = function(line) { var anchor = document.createElement('a'); anchor.innerHTML = '✔'; anchor.classList.add('action'); line.element.insertBefore(anchor, line.element.firstChild); anchor.onclick = function(e) { if (line.series.disabled) { line.series.enable(); line.element.classList.remove('disabled'); } else { if (this.graph.series.filter(function(s) { return !s.disabled }).length <= 1) return; line.series.disable(); line.element.classList.add('disabled'); } }.bind(this); var label = line.element.getElementsByTagName('span')[0]; label.onclick = function(e){ var disableAllOtherLines = line.series.disabled; if ( ! disableAllOtherLines ) { for ( var i = 0; i < self.legend.lines.length; i++ ) { var l = self.legend.lines[i]; if ( line.series === l.series ) { // noop } else if ( l.series.disabled ) { // noop } else { disableAllOtherLines = true; break; } } } // show all or none if ( disableAllOtherLines ) { // these must happen first or else we try ( and probably fail ) to make a no line graph line.series.enable(); line.element.classList.remove('disabled'); self.legend.lines.forEach(function(l){ if ( line.series === l.series ) { // noop } else { l.series.disable(); l.element.classList.add('disabled'); } }); } else { self.legend.lines.forEach(function(l){ l.series.enable(); l.element.classList.remove('disabled'); }); } }; }; if (this.legend) { if (typeof $ != 'undefined' && $(this.legend.list).sortable) { $(this.legend.list).sortable( { start: function(event, ui) { ui.item.bind('no.onclick', function(event) { event.preventDefault(); } ); }, stop: function(event, ui) { setTimeout(function(){ ui.item.unbind('no.onclick'); }, 250); } }); } this.legend.lines.forEach( function(l) { self.addAnchor(l); } ); } this._addBehavior = function() { this.graph.series.forEach( function(s) { s.disable = function() { if (self.graph.series.length <= 1) { throw('only one series left'); } s.disabled = true; self.graph.update(); }; s.enable = function() { s.disabled = false; self.graph.update(); }; } ); }; this._addBehavior(); this.updateBehaviour = function () { this._addBehavior() }; }; rickshaw-1.4.6/src/js/Rickshaw.Graph.HoverDetail.js000066400000000000000000000151311225123340100221100ustar00rootroot00000000000000Rickshaw.namespace('Rickshaw.Graph.HoverDetail'); Rickshaw.Graph.HoverDetail = Rickshaw.Class.create({ initialize: function(args) { var graph = this.graph = args.graph; this.xFormatter = args.xFormatter || function(x) { return new Date( x * 1000 ).toUTCString(); }; this.yFormatter = args.yFormatter || function(y) { return y === null ? y : y.toFixed(2); }; var element = this.element = document.createElement('div'); element.className = 'detail'; this.visible = true; graph.element.appendChild(element); this.lastEvent = null; this._addListeners(); this.onShow = args.onShow; this.onHide = args.onHide; this.onRender = args.onRender; this.formatter = args.formatter || this.formatter; }, formatter: function(series, x, y, formattedX, formattedY, d) { return series.name + ': ' + formattedY; }, update: function(e) { e = e || this.lastEvent; if (!e) return; this.lastEvent = e; if (!e.target.nodeName.match(/^(path|svg|rect|circle)$/)) return; var graph = this.graph; var eventX = e.offsetX || e.layerX; var eventY = e.offsetY || e.layerY; var j = 0; var points = []; var nearestPoint; this.graph.series.active().forEach( function(series) { var data = this.graph.stackedData[j++]; if (!data.length) return; var domainX = graph.x.invert(eventX); var domainIndexScale = d3.scale.linear() .domain([data[0].x, data.slice(-1)[0].x]) .range([0, data.length - 1]); var approximateIndex = Math.round(domainIndexScale(domainX)); if (approximateIndex == data.length - 1) approximateIndex--; var dataIndex = Math.min(approximateIndex || 0, data.length - 1); for (var i = approximateIndex; i < data.length - 1;) { if (!data[i] || !data[i + 1]) break; if (data[i].x <= domainX && data[i + 1].x > domainX) { dataIndex = Math.abs(domainX - data[i].x) < Math.abs(domainX - data[i + 1].x) ? i : i + 1; break; } if (data[i + 1].x <= domainX) { i++ } else { i-- } } if (dataIndex < 0) dataIndex = 0; var value = data[dataIndex]; var distance = Math.sqrt( Math.pow(Math.abs(graph.x(value.x) - eventX), 2) + Math.pow(Math.abs(graph.y(value.y + value.y0) - eventY), 2) ); var xFormatter = series.xFormatter || this.xFormatter; var yFormatter = series.yFormatter || this.yFormatter; var point = { formattedXValue: xFormatter(value.x), formattedYValue: yFormatter(series.scale ? series.scale.invert(value.y) : value.y), series: series, value: value, distance: distance, order: j, name: series.name }; if (!nearestPoint || distance < nearestPoint.distance) { nearestPoint = point; } points.push(point); }, this ); if (!nearestPoint) return; nearestPoint.active = true; var domainX = nearestPoint.value.x; var formattedXValue = nearestPoint.formattedXValue; this.element.innerHTML = ''; this.element.style.left = graph.x(domainX) + 'px'; this.visible && this.render( { points: points, detail: points, // for backwards compatibility mouseX: eventX, mouseY: eventY, formattedXValue: formattedXValue, domainX: domainX } ); }, hide: function() { this.visible = false; this.element.classList.add('inactive'); if (typeof this.onHide == 'function') { this.onHide(); } }, show: function() { this.visible = true; this.element.classList.remove('inactive'); if (typeof this.onShow == 'function') { this.onShow(); } }, render: function(args) { var graph = this.graph; var points = args.points; var point = points.filter( function(p) { return p.active } ).shift(); if (point.value.y === null) return; var formattedXValue = point.formattedXValue; var formattedYValue = point.formattedYValue; this.element.innerHTML = ''; this.element.style.left = graph.x(point.value.x) + 'px'; var xLabel = document.createElement('div'); xLabel.className = 'x_label'; xLabel.innerHTML = formattedXValue; this.element.appendChild(xLabel); var item = document.createElement('div'); item.className = 'item'; // invert the scale if this series displays using a scale var series = point.series; var actualY = series.scale ? series.scale.invert(point.value.y) : point.value.y; item.innerHTML = this.formatter(series, point.value.x, actualY, formattedXValue, formattedYValue, point); item.style.top = this.graph.y(point.value.y0 + point.value.y) + 'px'; this.element.appendChild(item); var dot = document.createElement('div'); dot.className = 'dot'; dot.style.top = item.style.top; dot.style.borderColor = series.color; this.element.appendChild(dot); if (point.active) { item.classList.add('active'); dot.classList.add('active'); } // Assume left alignment until the element has been displayed and // bounding box calculations are possible. var alignables = [xLabel, item]; alignables.forEach(function(el) { el.classList.add('left'); }); this.show(); // If left-alignment results in any error, try right-alignment. var leftAlignError = this._calcLayoutError(alignables); if (leftAlignError > 0) { alignables.forEach(function(el) { el.classList.remove('left'); el.classList.add('right'); }); // If right-alignment is worse than left alignment, switch back. var rightAlignError = this._calcLayoutError(alignables); if (rightAlignError > leftAlignError) { alignables.forEach(function(el) { el.classList.remove('right'); el.classList.add('left'); }); } } if (typeof this.onRender == 'function') { this.onRender(args); } }, _calcLayoutError: function(alignables) { // Layout error is calculated as the number of linear pixels by which // an alignable extends past the left or right edge of the parent. var parentRect = this.element.parentNode.getBoundingClientRect(); var error = 0; var alignRight = alignables.forEach(function(el) { var rect = el.getBoundingClientRect(); if (!rect.width) { return; } if (rect.right > parentRect.right) { error += rect.right - parentRect.right; } if (rect.left < parentRect.left) { error += parentRect.left - rect.left; } }); return error; }, _addListeners: function() { this.graph.element.addEventListener( 'mousemove', function(e) { this.visible = true; this.update(e); }.bind(this), false ); this.graph.onUpdate( function() { this.update() }.bind(this) ); this.graph.element.addEventListener( 'mouseout', function(e) { if (e.relatedTarget && !(e.relatedTarget.compareDocumentPosition(this.graph.element) & Node.DOCUMENT_POSITION_CONTAINS)) { this.hide(); } }.bind(this), false ); } }); rickshaw-1.4.6/src/js/Rickshaw.Graph.JSONP.js000066400000000000000000000004271225123340100205750ustar00rootroot00000000000000Rickshaw.namespace('Rickshaw.Graph.JSONP'); Rickshaw.Graph.JSONP = Rickshaw.Class.create( Rickshaw.Graph.Ajax, { request: function() { $.ajax( { url: this.dataURL, dataType: 'jsonp', success: this.success.bind(this), error: this.error.bind(this) } ); } } ); rickshaw-1.4.6/src/js/Rickshaw.Graph.Legend.js000066400000000000000000000035141225123340100211020ustar00rootroot00000000000000Rickshaw.namespace('Rickshaw.Graph.Legend'); Rickshaw.Graph.Legend = Rickshaw.Class.create( { className: 'rickshaw_legend', initialize: function(args) { this.element = args.element; this.graph = args.graph; this.naturalOrder = args.naturalOrder; this.element.classList.add(this.className); this.list = document.createElement('ul'); this.element.appendChild(this.list); this.render(); // we could bind this.render.bind(this) here // but triggering the re-render would lose the added // behavior of the series toggle this.graph.onUpdate( function() {} ); }, render: function() { var self = this; while ( this.list.firstChild ) { this.list.removeChild( this.list.firstChild ); } this.lines = []; var series = this.graph.series .map( function(s) { return s } ); if (!this.naturalOrder) { series = series.reverse(); } series.forEach( function(s) { self.addLine(s); } ); }, addLine: function (series) { var line = document.createElement('li'); line.className = 'line'; if (series.disabled) { line.className += ' disabled'; } if (series.className) { d3.select(line).classed(series.className, true); } var swatch = document.createElement('div'); swatch.className = 'swatch'; swatch.style.backgroundColor = series.color; line.appendChild(swatch); var label = document.createElement('span'); label.className = 'label'; label.innerHTML = series.name; line.appendChild(label); this.list.appendChild(line); line.series = series; if (series.noLegend) { line.style.display = 'none'; } var _line = { element: line, series: series }; if (this.shelving) { this.shelving.addAnchor(_line); this.shelving.updateBehaviour(); } if (this.highlighter) { this.highlighter.addHighlightEvents(_line); } this.lines.push(_line); return line; } } ); rickshaw-1.4.6/src/js/Rickshaw.Graph.RangeSlider.Preview.js000066400000000000000000000312341225123340100235230ustar00rootroot00000000000000Rickshaw.namespace('Rickshaw.Graph.RangeSlider.Preview'); Rickshaw.Graph.RangeSlider.Preview = Rickshaw.Class.create({ initialize: function(args) { if (!args.element) throw "Rickshaw.Graph.RangeSlider.Preview needs a reference to an element"; if (!args.graph && !args.graphs) throw "Rickshaw.Graph.RangeSlider.Preview needs a reference to an graph or an array of graphs"; this.element = args.element; this.graphs = args.graph ? [ args.graph ] : args.graphs; this.defaults = { height: 75, width: 400, gripperColor: undefined, frameTopThickness: 3, frameHandleThickness: 10, frameColor: "#d4d4d4", frameOpacity: 1, minimumFrameWidth: 0 }; this.defaults.gripperColor = d3.rgb(this.defaults.frameColor).darker().toString(); this.configureCallbacks = []; this.previews = []; args.width = args.width || this.graphs[0].width || this.defaults.width; args.height = args.height || this.graphs[0].height / 5 || this.defaults.height; this.configure(args); this.render(); }, onConfigure: function(callback) { this.configureCallbacks.push(callback); }, configure: function(args) { this.config = {}; this.configureCallbacks.forEach(function(callback) { callback(args); }); Rickshaw.keys(this.defaults).forEach(function(k) { this.config[k] = k in args ? args[k] : k in this.config ? this.config[k] : this.defaults[k]; }, this); if (args.width) { this.previews.forEach(function(preview) { var width = args.width - this.config.frameHandleThickness * 2; preview.setSize({ width: width }); }, this); } if (args.height) { this.previews.forEach(function(preview) { var height = this.previewHeight / this.graphs.length; preview.setSize({ height: height }); }, this); } }, render: function() { var self = this; this.svg = d3.select(this.element) .selectAll("svg.rickshaw_range_slider_preview") .data([null]); this.previewHeight = this.config.height - (this.config.frameTopThickness * 2); this.previewWidth = this.config.width - (this.config.frameHandleThickness * 2); this.currentFrame = [0, this.previewWidth]; var buildGraph = function(parent, index) { var graphArgs = Rickshaw.extend({}, parent.config); var height = self.previewHeight / self.graphs.length; Rickshaw.extend(graphArgs, { element: this.appendChild(document.createElement("div")), height: height, width: self.previewWidth, series: parent.series }); var graph = new Rickshaw.Graph(graphArgs); self.previews.push(graph); parent.onUpdate(function() { graph.render(); self.render() }); parent.onConfigure(function(args) { // don't propagate height delete args.height; graph.configure(args); graph.render(); }); graph.render(); }; var graphContainer = d3.select(this.element) .selectAll("div.rickshaw_range_slider_preview_container") .data(this.graphs); var translateCommand = "translate(" + this.config.frameHandleThickness + "px, " + this.config.frameTopThickness + "px)"; graphContainer.enter() .append("div") .classed("rickshaw_range_slider_preview_container", true) .style("-webkit-transform", translateCommand) .style("-moz-transform", translateCommand) .style("-ms-transform", translateCommand) .style("transform", translateCommand) .each(buildGraph); graphContainer.exit() .remove(); // Use the first graph as the "master" for the frame state var masterGraph = this.graphs[0]; var domainScale = d3.scale.linear() .domain([0, this.previewWidth]) .range(masterGraph.dataDomain()); var currentWindow = [masterGraph.window.xMin, masterGraph.window.xMax]; this.currentFrame[0] = currentWindow[0] === undefined ? 0 : Math.round(domainScale.invert(currentWindow[0])); if (this.currentFrame[0] < 0) this.currentFrame[0] = 0; this.currentFrame[1] = currentWindow[1] === undefined ? this.previewWidth : domainScale.invert(currentWindow[1]); if (this.currentFrame[1] - this.currentFrame[0] < self.config.minimumFrameWidth) { this.currentFrame[1] = (this.currentFrame[0] || 0) + self.config.minimumFrameWidth; } this.svg.enter() .append("svg") .classed("rickshaw_range_slider_preview", true) .style("height", this.config.height + "px") .style("width", this.config.width + "px") .style("position", "relative") .style("top", -this.previewHeight + "px"); this._renderDimming(); this._renderFrame(); this._renderGrippers(); this._renderHandles(); this._renderMiddle(); this._registerMouseEvents(); }, _renderDimming: function() { var element = this.svg .selectAll("path.dimming") .data([null]); element.enter() .append("path") .attr("fill", "white") .attr("fill-opacity", "0.7") .attr("fill-rule", "evenodd") .classed("dimming", true); var path = ""; path += " M " + this.config.frameHandleThickness + " " + this.config.frameTopThickness; path += " h " + this.previewWidth; path += " v " + this.previewHeight; path += " h " + -this.previewWidth; path += " z "; path += " M " + Math.max(this.currentFrame[0], this.config.frameHandleThickness) + " " + this.config.frameTopThickness; path += " H " + Math.min(this.currentFrame[1] + this.config.frameHandleThickness * 2, this.previewWidth + this.config.frameHandleThickness); path += " v " + this.previewHeight; path += " H " + Math.max(this.currentFrame[0], this.config.frameHandleThickness); path += " z"; element.attr("d", path); }, _renderFrame: function() { var element = this.svg .selectAll("path.frame") .data([null]); element.enter() .append("path") .attr("stroke", "white") .attr("stroke-width", "1px") .attr("stroke-linejoin", "round") .attr("fill", this.config.frameColor) .attr("fill-opacity", this.config.frameOpacity) .attr("fill-rule", "evenodd") .classed("frame", true); var path = ""; path += " M " + this.currentFrame[0] + " 0"; path += " H " + (this.currentFrame[1] + (this.config.frameHandleThickness * 2)); path += " V " + this.config.height; path += " H " + (this.currentFrame[0]); path += " z"; path += " M " + (this.currentFrame[0] + this.config.frameHandleThickness) + " " + this.config.frameTopThickness; path += " H " + (this.currentFrame[1] + this.config.frameHandleThickness); path += " v " + this.previewHeight; path += " H " + (this.currentFrame[0] + this.config.frameHandleThickness); path += " z"; element.attr("d", path); }, _renderGrippers: function() { var gripper = this.svg.selectAll("path.gripper") .data([null]); gripper.enter() .append("path") .attr("stroke", this.config.gripperColor) .classed("gripper", true); var path = ""; [0.4, 0.6].forEach(function(spacing) { path += " M " + Math.round((this.currentFrame[0] + (this.config.frameHandleThickness * spacing))) + " " + Math.round(this.config.height * 0.3); path += " V " + Math.round(this.config.height * 0.7); path += " M " + Math.round((this.currentFrame[1] + (this.config.frameHandleThickness * (1 + spacing)))) + " " + Math.round(this.config.height * 0.3); path += " V " + Math.round(this.config.height * 0.7); }.bind(this)); gripper.attr("d", path); }, _renderHandles: function() { var leftHandle = this.svg.selectAll("rect.left_handle") .data([null]); leftHandle.enter() .append("rect") .attr('width', this.config.frameHandleThickness) .attr('height', this.config.height) .style("cursor", "ew-resize") .style("fill-opacity", "0") .classed("left_handle", true); leftHandle.attr('x', this.currentFrame[0]); var rightHandle = this.svg.selectAll("rect.right_handle") .data([null]); rightHandle.enter() .append("rect") .attr('width', this.config.frameHandleThickness) .attr('height', this.config.height) .style("cursor", "ew-resize") .style("fill-opacity", "0") .classed("right_handle", true); rightHandle.attr('x', this.currentFrame[1] + this.config.frameHandleThickness); }, _renderMiddle: function() { var middleHandle = this.svg.selectAll("rect.middle_handle") .data([null]); middleHandle.enter() .append("rect") .attr('height', this.config.height) .style("cursor", "move") .style("fill-opacity", "0") .classed("middle_handle", true); middleHandle .attr('width', Math.max(0, this.currentFrame[1] - this.currentFrame[0])) .attr('x', this.currentFrame[0] + this.config.frameHandleThickness); }, _registerMouseEvents: function() { var element = d3.select(this.element); var drag = { target: null, start: null, stop: null, left: false, right: false, rigid: false }; var self = this; function onMousemove(datum, index) { drag.stop = self._getClientXFromEvent(d3.event, drag); var distanceTraveled = drag.stop - drag.start; var frameAfterDrag = self.frameBeforeDrag.slice(0); var minimumFrameWidth = self.config.minimumFrameWidth; if (drag.rigid) { minimumFrameWidth = self.frameBeforeDrag[1] - self.frameBeforeDrag[0]; } if (drag.left) { frameAfterDrag[0] = Math.max(frameAfterDrag[0] + distanceTraveled, 0); } if (drag.right) { frameAfterDrag[1] = Math.min(frameAfterDrag[1] + distanceTraveled, self.previewWidth); } var currentFrameWidth = frameAfterDrag[1] - frameAfterDrag[0]; if (currentFrameWidth <= minimumFrameWidth) { if (drag.left) { frameAfterDrag[0] = frameAfterDrag[1] - minimumFrameWidth; } if (drag.right) { frameAfterDrag[1] = frameAfterDrag[0] + minimumFrameWidth; } if (frameAfterDrag[0] <= 0) { frameAfterDrag[1] -= frameAfterDrag[0]; frameAfterDrag[0] = 0; } if (frameAfterDrag[1] >= self.previewWidth) { frameAfterDrag[0] -= (frameAfterDrag[1] - self.previewWidth); frameAfterDrag[1] = self.previewWidth; } } self.graphs.forEach(function(graph) { var domainScale = d3.scale.linear() .interpolate(d3.interpolateRound) .domain([0, self.previewWidth]) .range(graph.dataDomain()); var windowAfterDrag = [ domainScale(frameAfterDrag[0]), domainScale(frameAfterDrag[1]) ]; if (frameAfterDrag[0] === 0) { windowAfterDrag[0] = undefined; } if (frameAfterDrag[1] === self.previewWidth) { windowAfterDrag[1] = undefined; } graph.window.xMin = windowAfterDrag[0]; graph.window.xMax = windowAfterDrag[1]; graph.update(); }); } function onMousedown() { drag.target = d3.event.target; drag.start = self._getClientXFromEvent(d3.event, drag); self.frameBeforeDrag = self.currentFrame.slice(); d3.event.preventDefault ? d3.event.preventDefault() : d3.event.returnValue = false; d3.select(document).on("mousemove.rickshaw_range_slider_preview", onMousemove); d3.select(document).on("mouseup.rickshaw_range_slider_preview", onMouseup); d3.select(document).on("touchmove.rickshaw_range_slider_preview", onMousemove); d3.select(document).on("touchend.rickshaw_range_slider_preview", onMouseup); d3.select(document).on("touchcancel.rickshaw_range_slider_preview", onMouseup); } function onMousedownLeftHandle(datum, index) { drag.left = true; onMousedown(); } function onMousedownRightHandle(datum, index) { drag.right = true; onMousedown(); } function onMousedownMiddleHandle(datum, index) { drag.left = true; drag.right = true; drag.rigid = true; onMousedown(); } function onMouseup(datum, index) { d3.select(document).on("mousemove.rickshaw_range_slider_preview", null); d3.select(document).on("mouseup.rickshaw_range_slider_preview", null); d3.select(document).on("touchmove.rickshaw_range_slider_preview", null); d3.select(document).on("touchend.rickshaw_range_slider_preview", null); d3.select(document).on("touchcancel.rickshaw_range_slider_preview", null); delete self.frameBeforeDrag; drag.left = false; drag.right = false; drag.rigid = false; } element.select("rect.left_handle").on("mousedown", onMousedownLeftHandle); element.select("rect.right_handle").on("mousedown", onMousedownRightHandle); element.select("rect.middle_handle").on("mousedown", onMousedownMiddleHandle); element.select("rect.left_handle").on("touchstart", onMousedownLeftHandle); element.select("rect.right_handle").on("touchstart", onMousedownRightHandle); element.select("rect.middle_handle").on("touchstart", onMousedownMiddleHandle); }, _getClientXFromEvent: function(event, drag) { switch (event.type) { case 'touchstart': case 'touchmove': var touchList = event.changedTouches; var touch = null; for (var touchIndex = 0; touchIndex < touchList.length; touchIndex++) { if (touchList[touchIndex].target === drag.target) { touch = touchList[touchIndex]; break; } } return touch !== null ? touch.clientX : undefined; default: return event.clientX; } } }); rickshaw-1.4.6/src/js/Rickshaw.Graph.RangeSlider.js000066400000000000000000000030021225123340100220730ustar00rootroot00000000000000Rickshaw.namespace('Rickshaw.Graph.RangeSlider'); Rickshaw.Graph.RangeSlider = Rickshaw.Class.create({ initialize: function(args) { var element = this.element = args.element; var graph = this.graph = args.graph; this.build(); graph.onUpdate( function() { this.update() }.bind(this) ); }, build: function() { var element = this.element; var graph = this.graph; var domain = graph.dataDomain(); $( function() { $(element).slider( { range: true, min: domain[0], max: domain[1], values: [ domain[0], domain[1] ], slide: function( event, ui ) { if (ui.values[1] <= ui.values[0]) return; graph.window.xMin = ui.values[0]; graph.window.xMax = ui.values[1]; graph.update(); var domain = graph.dataDomain(); // if we're at an extreme, stick there if (domain[0] == ui.values[0]) { graph.window.xMin = undefined; } if (domain[1] == ui.values[1]) { graph.window.xMax = undefined; } } } ); } ); $(element)[0].style.width = graph.width + 'px'; }, update: function() { var element = this.element; var graph = this.graph; var values = $(element).slider('option', 'values'); var domain = graph.dataDomain(); $(element).slider('option', 'min', domain[0]); $(element).slider('option', 'max', domain[1]); if (graph.window.xMin == null) { values[0] = domain[0]; } if (graph.window.xMax == null) { values[1] = domain[1]; } $(element).slider('option', 'values', values); } }); rickshaw-1.4.6/src/js/Rickshaw.Graph.Renderer.Area.js000066400000000000000000000044771225123340100223320ustar00rootroot00000000000000Rickshaw.namespace('Rickshaw.Graph.Renderer.Area'); Rickshaw.Graph.Renderer.Area = Rickshaw.Class.create( Rickshaw.Graph.Renderer, { name: 'area', defaults: function($super) { return Rickshaw.extend( $super(), { unstack: false, fill: false, stroke: false } ); }, seriesPathFactory: function() { var graph = this.graph; var factory = d3.svg.area() .x( function(d) { return graph.x(d.x) } ) .y0( function(d) { return graph.y(d.y0) } ) .y1( function(d) { return graph.y(d.y + d.y0) } ) .interpolate(graph.interpolation).tension(this.tension); factory.defined && factory.defined( function(d) { return d.y !== null } ); return factory; }, seriesStrokeFactory: function() { var graph = this.graph; var factory = d3.svg.line() .x( function(d) { return graph.x(d.x) } ) .y( function(d) { return graph.y(d.y + d.y0) } ) .interpolate(graph.interpolation).tension(this.tension); factory.defined && factory.defined( function(d) { return d.y !== null } ); return factory; }, render: function(args) { args = args || {}; var graph = this.graph; var series = args.series || graph.series; var vis = args.vis || graph.vis; vis.selectAll('*').remove(); // insert or stacked areas so strokes lay on top of areas var method = this.unstack ? 'append' : 'insert'; var data = series .filter(function(s) { return !s.disabled }) .map(function(s) { return s.stack }); var nodes = vis.selectAll("path") .data(data) .enter()[method]("svg:g", 'g'); nodes.append("svg:path") .attr("d", this.seriesPathFactory()) .attr("class", 'area'); if (this.stroke) { nodes.append("svg:path") .attr("d", this.seriesStrokeFactory()) .attr("class", 'line'); } var i = 0; series.forEach( function(series) { if (series.disabled) return; series.path = nodes[0][i++]; this._styleSeries(series); }, this ); }, _styleSeries: function(series) { if (!series.path) return; d3.select(series.path).select('.area') .attr('fill', series.color); if (this.stroke) { d3.select(series.path).select('.line') .attr('fill', 'none') .attr('stroke', series.stroke || d3.interpolateRgb(series.color, 'black')(0.125)) .attr('stroke-width', this.strokeWidth); } if (series.className) { series.path.setAttribute('class', series.className); } } } ); rickshaw-1.4.6/src/js/Rickshaw.Graph.Renderer.Bar.js000066400000000000000000000054261225123340100221610ustar00rootroot00000000000000Rickshaw.namespace('Rickshaw.Graph.Renderer.Bar'); Rickshaw.Graph.Renderer.Bar = Rickshaw.Class.create( Rickshaw.Graph.Renderer, { name: 'bar', defaults: function($super) { var defaults = Rickshaw.extend( $super(), { gapSize: 0.05, unstack: false } ); delete defaults.tension; return defaults; }, initialize: function($super, args) { args = args || {}; this.gapSize = args.gapSize || this.gapSize; $super(args); }, domain: function($super) { var domain = $super(); var frequentInterval = this._frequentInterval(this.graph.stackedData.slice(-1).shift()); domain.x[1] += Number(frequentInterval.magnitude); return domain; }, barWidth: function(series) { var frequentInterval = this._frequentInterval(series.stack); var barWidth = this.graph.x(series.stack[0].x + frequentInterval.magnitude * (1 - this.gapSize)); return barWidth; }, render: function(args) { args = args || {}; var graph = this.graph; var series = args.series || graph.series; var vis = args.vis || graph.vis; vis.selectAll('*').remove(); var barWidth = this.barWidth(series.active()[0]); var barXOffset = 0; var activeSeriesCount = series.filter( function(s) { return !s.disabled; } ).length; var seriesBarWidth = this.unstack ? barWidth / activeSeriesCount : barWidth; var transform = function(d) { // add a matrix transform for negative values var matrix = [ 1, 0, 0, (d.y < 0 ? -1 : 1), 0, (d.y < 0 ? graph.y.magnitude(Math.abs(d.y)) * 2 : 0) ]; return "matrix(" + matrix.join(',') + ")"; }; series.forEach( function(series) { if (series.disabled) return; var barWidth = this.barWidth(series); var nodes = vis.selectAll("path") .data(series.stack.filter( function(d) { return d.y !== null } )) .enter().append("svg:rect") .attr("x", function(d) { return graph.x(d.x) + barXOffset }) .attr("y", function(d) { return (graph.y(d.y0 + Math.abs(d.y))) * (d.y < 0 ? -1 : 1 ) }) .attr("width", seriesBarWidth) .attr("height", function(d) { return graph.y.magnitude(Math.abs(d.y)) }) .attr("transform", transform); Array.prototype.forEach.call(nodes[0], function(n) { n.setAttribute('fill', series.color); } ); if (this.unstack) barXOffset += seriesBarWidth; }, this ); }, _frequentInterval: function(data) { var intervalCounts = {}; for (var i = 0; i < data.length - 1; i++) { var interval = data[i + 1].x - data[i].x; intervalCounts[interval] = intervalCounts[interval] || 0; intervalCounts[interval]++; } var frequentInterval = { count: 0, magnitude: 1 }; Rickshaw.keys(intervalCounts).forEach( function(i) { if (frequentInterval.count < intervalCounts[i]) { frequentInterval = { count: intervalCounts[i], magnitude: i }; } } ); return frequentInterval; } } ); rickshaw-1.4.6/src/js/Rickshaw.Graph.Renderer.Line.js000066400000000000000000000011711225123340100223350ustar00rootroot00000000000000Rickshaw.namespace('Rickshaw.Graph.Renderer.Line'); Rickshaw.Graph.Renderer.Line = Rickshaw.Class.create( Rickshaw.Graph.Renderer, { name: 'line', defaults: function($super) { return Rickshaw.extend( $super(), { unstack: true, fill: false, stroke: true } ); }, seriesPathFactory: function() { var graph = this.graph; var factory = d3.svg.line() .x( function(d) { return graph.x(d.x) } ) .y( function(d) { return graph.y(d.y) } ) .interpolate(this.graph.interpolation).tension(this.tension); factory.defined && factory.defined( function(d) { return d.y !== null } ); return factory; } } ); rickshaw-1.4.6/src/js/Rickshaw.Graph.Renderer.LinePlot.js000066400000000000000000000040261225123340100231760ustar00rootroot00000000000000Rickshaw.namespace('Rickshaw.Graph.Renderer.LinePlot'); Rickshaw.Graph.Renderer.LinePlot = Rickshaw.Class.create( Rickshaw.Graph.Renderer, { name: 'lineplot', defaults: function($super) { return Rickshaw.extend( $super(), { unstack: true, fill: false, stroke: true, padding:{ top: 0.01, right: 0.01, bottom: 0.01, left: 0.01 }, dotSize: 3, strokeWidth: 2 } ); }, initialize: function($super, args) { $super(args); }, seriesPathFactory: function() { var graph = this.graph; var factory = d3.svg.line() .x( function(d) { return graph.x(d.x) } ) .y( function(d) { return graph.y(d.y) } ) .interpolate(this.graph.interpolation).tension(this.tension); factory.defined && factory.defined( function(d) { return d.y !== null } ); return factory; }, _renderDots: function() { var graph = this.graph; graph.series.forEach(function(series) { if (series.disabled) return; var nodes = graph.vis.selectAll("x") .data(series.stack.filter( function(d) { return d.y !== null } )) .enter().append("svg:circle") .attr("cx", function(d) { return graph.x(d.x) }) .attr("cy", function(d) { return graph.y(d.y) }) .attr("r", function(d) { return ("r" in d) ? d.r : graph.renderer.dotSize}); Array.prototype.forEach.call(nodes[0], function(n) { if (!n) return; n.setAttribute('data-color', series.color); n.setAttribute('fill', 'white'); n.setAttribute('stroke', series.color); n.setAttribute('stroke-width', this.strokeWidth); }.bind(this)); }, this); }, _renderLines: function() { var graph = this.graph; var nodes = graph.vis.selectAll("path") .data(this.graph.stackedData) .enter().append("svg:path") .attr("d", this.seriesPathFactory()); var i = 0; graph.series.forEach(function(series) { if (series.disabled) return; series.path = nodes[0][i++]; this._styleSeries(series); }, this); }, render: function() { var graph = this.graph; graph.vis.selectAll('*').remove(); this._renderLines(); this._renderDots(); } } ); rickshaw-1.4.6/src/js/Rickshaw.Graph.Renderer.Multi.js000066400000000000000000000062371225123340100225500ustar00rootroot00000000000000Rickshaw.namespace('Rickshaw.Graph.Renderer.Multi'); Rickshaw.Graph.Renderer.Multi = Rickshaw.Class.create( Rickshaw.Graph.Renderer, { name: 'multi', initialize: function($super, args) { $super(args); }, defaults: function($super) { return Rickshaw.extend( $super(), { unstack: true, fill: false, stroke: true } ); }, configure: function($super, args) { args = args || {}; this.config = args; $super(args); }, domain: function($super) { this.graph.stackData(); var domains = []; var groups = this._groups(); this._stack(groups); groups.forEach( function(group) { var data = group.series .filter( function(s) { return !s.disabled } ) .map( function(s) { return s.stack }); if (!data.length) return; var domain = $super(data); domains.push(domain); }); var xMin = d3.min(domains.map( function(d) { return d.x[0] } )); var xMax = d3.max(domains.map( function(d) { return d.x[1] } )); var yMin = d3.min(domains.map( function(d) { return d.y[0] } )); var yMax = d3.max(domains.map( function(d) { return d.y[1] } )); return { x: [xMin, xMax], y: [yMin, yMax] }; }, _groups: function() { var graph = this.graph; var renderGroups = {}; graph.series.forEach( function(series) { if (series.disabled) return; if (!renderGroups[series.renderer]) { var ns = "http://www.w3.org/2000/svg"; var vis = document.createElementNS(ns, 'g'); graph.vis[0][0].appendChild(vis); var renderer = graph._renderers[series.renderer]; var config = {}; var defaults = [ this.defaults(), renderer.defaults(), this.config, this.graph ]; defaults.forEach(function(d) { Rickshaw.extend(config, d) }); renderer.configure(config); renderGroups[series.renderer] = { renderer: renderer, series: [], vis: d3.select(vis) }; } renderGroups[series.renderer].series.push(series); }, this); var groups = []; Object.keys(renderGroups).forEach( function(key) { var group = renderGroups[key]; groups.push(group); }); return groups; }, _stack: function(groups) { groups.forEach( function(group) { var series = group.series .filter( function(series) { return !series.disabled } ); var data = series .map( function(series) { return series.stack } ); if (!group.renderer.unstack) { var layout = d3.layout.stack(); var stackedData = Rickshaw.clone(layout(data)); series.forEach( function(series, index) { series._stack = Rickshaw.clone(stackedData[index]); }); } }, this ); return groups; }, render: function() { this.graph.series.forEach( function(series) { if (!series.renderer) { throw new Error("Each series needs a renderer for graph 'multi' renderer"); } }); this.graph.vis.selectAll('*').remove(); var groups = this._groups(); groups = this._stack(groups); groups.forEach( function(group) { var series = group.series .filter( function(series) { return !series.disabled } ); series.active = function() { return series }; group.renderer.render({ series: series, vis: group.vis }); series.forEach(function(s) { s.stack = s._stack || s.stack || s.data; }); }); } } ); rickshaw-1.4.6/src/js/Rickshaw.Graph.Renderer.ScatterPlot.js000066400000000000000000000023471225123340100237200ustar00rootroot00000000000000Rickshaw.namespace('Rickshaw.Graph.Renderer.ScatterPlot'); Rickshaw.Graph.Renderer.ScatterPlot = Rickshaw.Class.create( Rickshaw.Graph.Renderer, { name: 'scatterplot', defaults: function($super) { return Rickshaw.extend( $super(), { unstack: true, fill: true, stroke: false, padding:{ top: 0.01, right: 0.01, bottom: 0.01, left: 0.01 }, dotSize: 4 } ); }, initialize: function($super, args) { $super(args); }, render: function(args) { args = args || {}; var graph = this.graph; var series = args.series || graph.series; var vis = args.vis || graph.vis; var dotSize = this.dotSize; vis.selectAll('*').remove(); series.forEach( function(series) { if (series.disabled) return; var nodes = vis.selectAll("path") .data(series.stack.filter( function(d) { return d.y !== null } )) .enter().append("svg:circle") .attr("cx", function(d) { return graph.x(d.x) }) .attr("cy", function(d) { return graph.y(d.y) }) .attr("r", function(d) { return ("r" in d) ? d.r : dotSize}); if (series.className) { nodes.classed(series.className, true); } Array.prototype.forEach.call(nodes[0], function(n) { n.setAttribute('fill', series.color); } ); }, this ); } } ); rickshaw-1.4.6/src/js/Rickshaw.Graph.Renderer.Stack.js000066400000000000000000000012641225123340100225160ustar00rootroot00000000000000Rickshaw.namespace('Rickshaw.Graph.Renderer.Stack'); Rickshaw.Graph.Renderer.Stack = Rickshaw.Class.create( Rickshaw.Graph.Renderer, { name: 'stack', defaults: function($super) { return Rickshaw.extend( $super(), { fill: true, stroke: false, unstack: false } ); }, seriesPathFactory: function() { var graph = this.graph; var factory = d3.svg.area() .x( function(d) { return graph.x(d.x) } ) .y0( function(d) { return graph.y(d.y0) } ) .y1( function(d) { return graph.y(d.y + d.y0) } ) .interpolate(this.graph.interpolation).tension(this.tension); factory.defined && factory.defined( function(d) { return d.y !== null } ); return factory; } } ); rickshaw-1.4.6/src/js/Rickshaw.Graph.Renderer.js000066400000000000000000000100761225123340100214530ustar00rootroot00000000000000Rickshaw.namespace("Rickshaw.Graph.Renderer"); Rickshaw.Graph.Renderer = Rickshaw.Class.create( { initialize: function(args) { this.graph = args.graph; this.tension = args.tension || this.tension; this.configure(args); }, seriesPathFactory: function() { //implement in subclass }, seriesStrokeFactory: function() { // implement in subclass }, defaults: function() { return { tension: 0.8, strokeWidth: 2, unstack: true, padding: { top: 0.01, right: 0, bottom: 0.01, left: 0 }, stroke: false, fill: false }; }, domain: function(data) { var stackedData = data || this.graph.stackedData || this.graph.stackData(); var firstPoint = stackedData[0][0]; if (firstPoint === undefined) { return { x: [null, null], y: [null, null] }; } var xMin = firstPoint.x; var xMax = firstPoint.x; var yMin = firstPoint.y + firstPoint.y0; var yMax = firstPoint.y + firstPoint.y0; stackedData.forEach( function(series) { series.forEach( function(d) { if (d.y == null) return; var y = d.y + d.y0; if (y < yMin) yMin = y; if (y > yMax) yMax = y; } ); if (!series.length) return; if (series[0].x < xMin) xMin = series[0].x; if (series[series.length - 1].x > xMax) xMax = series[series.length - 1].x; } ); xMin -= (xMax - xMin) * this.padding.left; xMax += (xMax - xMin) * this.padding.right; yMin = this.graph.min === 'auto' ? yMin : this.graph.min || 0; yMax = this.graph.max === undefined ? yMax : this.graph.max; if (this.graph.min === 'auto' || yMin < 0) { yMin -= (yMax - yMin) * this.padding.bottom; } if (this.graph.max === undefined) { yMax += (yMax - yMin) * this.padding.top; } return { x: [xMin, xMax], y: [yMin, yMax] }; }, render: function(args) { args = args || {}; var graph = this.graph; var series = args.series || graph.series; var vis = args.vis || graph.vis; vis.selectAll('*').remove(); var data = series .filter(function(s) { return !s.disabled }) .map(function(s) { return s.stack }); var pathNodes = vis.selectAll("path.path") .data(data) .enter().append("svg:path") .classed('path', true) .attr("d", this.seriesPathFactory()); if (this.stroke) { var strokeNodes = vis.selectAll('path.stroke') .data(data) .enter().append("svg:path") .classed('stroke', true) .attr("d", this.seriesStrokeFactory()); } var i = 0; series.forEach( function(series) { if (series.disabled) return; series.path = pathNodes[0][i]; if (this.stroke) series.stroke = strokeNodes[0][i]; this._styleSeries(series); i++; }, this ); }, _styleSeries: function(series) { var fill = this.fill ? series.color : 'none'; var stroke = this.stroke ? series.color : 'none'; series.path.setAttribute('fill', fill); series.path.setAttribute('stroke', stroke); series.path.setAttribute('stroke-width', this.strokeWidth); if (series.className) { d3.select(series.path).classed(series.className, true); } if (series.className && this.stroke) { d3.select(series.stroke).classed(series.className, true); } }, configure: function(args) { args = args || {}; Rickshaw.keys(this.defaults()).forEach( function(key) { if (!args.hasOwnProperty(key)) { this[key] = this[key] || this.graph[key] || this.defaults()[key]; return; } if (typeof this.defaults()[key] == 'object') { Rickshaw.keys(this.defaults()[key]).forEach( function(k) { this[key][k] = args[key][k] !== undefined ? args[key][k] : this[key][k] !== undefined ? this[key][k] : this.defaults()[key][k]; }, this ); } else { this[key] = args[key] !== undefined ? args[key] : this[key] !== undefined ? this[key] : this.graph[key] !== undefined ? this.graph[key] : this.defaults()[key]; } }, this ); }, setStrokeWidth: function(strokeWidth) { if (strokeWidth !== undefined) { this.strokeWidth = strokeWidth; } }, setTension: function(tension) { if (tension !== undefined) { this.tension = tension; } } } ); rickshaw-1.4.6/src/js/Rickshaw.Graph.Smoother.js000066400000000000000000000025241225123340100215040ustar00rootroot00000000000000Rickshaw.namespace('Rickshaw.Graph.Smoother'); Rickshaw.Graph.Smoother = Rickshaw.Class.create({ initialize: function(args) { this.graph = args.graph; this.element = args.element; this.aggregationScale = 1; this.build(); this.graph.stackData.hooks.data.push( { name: 'smoother', orderPosition: 50, f: this.transformer.bind(this) } ); }, build: function() { var self = this; if (this.element) { $( function() { $(self.element).slider( { min: 1, max: 100, slide: function( event, ui ) { self.setScale(ui.value); self.graph.update(); } } ); } ); } }, setScale: function(scale) { if (scale < 1) { throw "scale out of range: " + scale; } this.aggregationScale = scale; this.graph.update(); }, transformer: function(data) { if (this.aggregationScale == 1) return data; var aggregatedData = []; data.forEach( function(seriesData) { var aggregatedSeriesData = []; while (seriesData.length) { var avgX = 0, avgY = 0; var slice = seriesData.splice(0, this.aggregationScale); slice.forEach( function(d) { avgX += d.x / slice.length; avgY += d.y / slice.length; } ); aggregatedSeriesData.push( { x: avgX, y: avgY } ); } aggregatedData.push(aggregatedSeriesData); }.bind(this) ); return aggregatedData; } }); rickshaw-1.4.6/src/js/Rickshaw.Graph.Socketio.js000066400000000000000000000004321225123340100214600ustar00rootroot00000000000000Rickshaw.namespace('Rickshaw.Graph.Socketio'); Rickshaw.Graph.Socketio = Rickshaw.Class.create( Rickshaw.Graph.Ajax, { request: function() { var socket = io.connect(this.dataURL); var self = this; socket.on('rickshaw', function (data) { self.success(data); }); } } ); rickshaw-1.4.6/src/js/Rickshaw.Graph.js000066400000000000000000000164441225123340100177130ustar00rootroot00000000000000Rickshaw.namespace('Rickshaw.Graph'); Rickshaw.Graph = function(args) { var self = this; this.initialize = function(args) { if (!args.element) throw "Rickshaw.Graph needs a reference to an element"; if (args.element.nodeType !== 1) throw "Rickshaw.Graph element was defined but not an HTML element"; this.element = args.element; this.series = args.series; this.window = {}; this.updateCallbacks = []; this.configureCallbacks = []; this.defaults = { interpolation: 'cardinal', offset: 'zero', min: undefined, max: undefined, preserve: false, xScale: undefined, yScale: undefined }; this._loadRenderers(); this.configure(args); this.validateSeries(args.series); this.series.active = function() { return self.series.filter( function(s) { return !s.disabled } ) }; this.setSize({ width: args.width, height: args.height }); this.element.classList.add('rickshaw_graph'); this.vis = d3.select(this.element) .append("svg:svg") .attr('width', this.width) .attr('height', this.height); this.discoverRange(); }; this._loadRenderers = function() { for (var name in Rickshaw.Graph.Renderer) { if (!name || !Rickshaw.Graph.Renderer.hasOwnProperty(name)) continue; var r = Rickshaw.Graph.Renderer[name]; if (!r || !r.prototype || !r.prototype.render) continue; self.registerRenderer(new r( { graph: self } )); } }; this.validateSeries = function(series) { if (!Array.isArray(series) && !(series instanceof Rickshaw.Series)) { var seriesSignature = Object.prototype.toString.apply(series); throw "series is not an array: " + seriesSignature; } var pointsCount; series.forEach( function(s) { if (!(s instanceof Object)) { throw "series element is not an object: " + s; } if (!(s.data)) { throw "series has no data: " + JSON.stringify(s); } if (!Array.isArray(s.data)) { throw "series data is not an array: " + JSON.stringify(s.data); } var x = s.data[0].x; var y = s.data[0].y; if (typeof x != 'number' || ( typeof y != 'number' && y !== null ) ) { throw "x and y properties of points should be numbers instead of " + (typeof x) + " and " + (typeof y); } if (s.data.length >= 3) { // probe to sanity check sort order if (s.data[2].x < s.data[1].x || s.data[1].x < s.data[0].x || s.data[s.data.length - 1].x < s.data[0].x) { throw "series data needs to be sorted on x values for series name: " + s.name; } } }, this ); }; this.dataDomain = function() { var data = this.series.map( function(s) { return s.data } ); var min = d3.min( data.map( function(d) { return d[0].x } ) ); var max = d3.max( data.map( function(d) { return d[d.length - 1].x } ) ); return [min, max]; }; this.discoverRange = function() { var domain = this.renderer.domain(); this.x = (this.xScale || d3.scale.linear()).domain(domain.x).range([0, this.width]); this.y = (this.yScale || d3.scale.linear()).domain(domain.y).range([this.height, 0]); this.y.magnitude = d3.scale.linear() .domain([domain.y[0] - domain.y[0], domain.y[1] - domain.y[0]]) .range([0, this.height]); }; this.render = function() { var stackedData = this.stackData(); this.discoverRange(); this.renderer.render(); this.updateCallbacks.forEach( function(callback) { callback(); } ); }; this.update = this.render; this.stackData = function() { var data = this.series.active() .map( function(d) { return d.data } ) .map( function(d) { return d.filter( function(d) { return this._slice(d) }, this ) }, this); var preserve = this.preserve; if (!preserve) { this.series.forEach( function(series) { if (series.scale) { // data must be preserved when a scale is used preserve = true; } } ); } data = preserve ? Rickshaw.clone(data) : data; this.series.active().forEach( function(series, index) { if (series.scale) { // apply scale to each series var seriesData = data[index]; if(seriesData) { seriesData.forEach( function(d) { d.y = series.scale(d.y); } ); } } } ); this.stackData.hooks.data.forEach( function(entry) { data = entry.f.apply(self, [data]); } ); var stackedData; if (!this.renderer.unstack) { this._validateStackable(); var layout = d3.layout.stack(); layout.offset( self.offset ); stackedData = layout(data); } stackedData = stackedData || data; if (this.renderer.unstack) { stackedData.forEach( function(seriesData) { seriesData.forEach( function(d) { d.y0 = d.y0 === undefined ? 0 : d.y0; } ); } ); } this.stackData.hooks.after.forEach( function(entry) { stackedData = entry.f.apply(self, [data]); } ); var i = 0; this.series.forEach( function(series) { if (series.disabled) return; series.stack = stackedData[i++]; } ); this.stackedData = stackedData; return stackedData; }; this._validateStackable = function() { var series = this.series; var pointsCount; series.forEach( function(s) { pointsCount = pointsCount || s.data.length; if (pointsCount && s.data.length != pointsCount) { throw "stacked series cannot have differing numbers of points: " + pointsCount + " vs " + s.data.length + "; see Rickshaw.Series.fill()"; } }, this ); }; this.stackData.hooks = { data: [], after: [] }; this._slice = function(d) { if (this.window.xMin || this.window.xMax) { var isInRange = true; if (this.window.xMin && d.x < this.window.xMin) isInRange = false; if (this.window.xMax && d.x > this.window.xMax) isInRange = false; return isInRange; } return true; }; this.onUpdate = function(callback) { this.updateCallbacks.push(callback); }; this.onConfigure = function(callback) { this.configureCallbacks.push(callback); }; this.registerRenderer = function(renderer) { this._renderers = this._renderers || {}; this._renderers[renderer.name] = renderer; }; this.configure = function(args) { this.config = this.config || {}; if (args.width || args.height) { this.setSize(args); } Rickshaw.keys(this.defaults).forEach( function(k) { this.config[k] = k in args ? args[k] : k in this ? this[k] : this.defaults[k]; }, this ); Rickshaw.keys(this.config).forEach( function(k) { this[k] = this.config[k]; }, this ); var renderer = args.renderer || (this.renderer && this.renderer.name) || 'stack'; this.setRenderer(renderer, args); this.configureCallbacks.forEach( function(callback) { callback(args); } ); }; this.setRenderer = function(r, args) { if (typeof r == 'function') { this.renderer = new r( { graph: self } ); this.registerRenderer(this.renderer); } else { if (!this._renderers[r]) { throw "couldn't find renderer " + r; } this.renderer = this._renderers[r]; } if (typeof args == 'object') { this.renderer.configure(args); } }; this.setSize = function(args) { args = args || {}; if (typeof window !== undefined) { var style = window.getComputedStyle(this.element, null); var elementWidth = parseInt(style.getPropertyValue('width'), 10); var elementHeight = parseInt(style.getPropertyValue('height'), 10); } this.width = args.width || elementWidth || 400; this.height = args.height || elementHeight || 250; this.vis && this.vis .attr('width', this.width) .attr('height', this.height); }; this.initialize(args); }; rickshaw-1.4.6/src/js/Rickshaw.Series.FixedDuration.js000066400000000000000000000041431225123340100226410ustar00rootroot00000000000000Rickshaw.namespace('Rickshaw.Series.FixedDuration'); Rickshaw.Series.FixedDuration = Rickshaw.Class.create(Rickshaw.Series, { initialize: function (data, palette, options) { options = options || {}; if (typeof(options.timeInterval) === 'undefined') { throw new Error('FixedDuration series requires timeInterval'); } if (typeof(options.maxDataPoints) === 'undefined') { throw new Error('FixedDuration series requires maxDataPoints'); } this.palette = new Rickshaw.Color.Palette(palette); this.timeBase = typeof(options.timeBase) === 'undefined' ? Math.floor(new Date().getTime() / 1000) : options.timeBase; this.setTimeInterval(options.timeInterval); if (this[0] && this[0].data && this[0].data.length) { this.currentSize = this[0].data.length; this.currentIndex = this[0].data.length; } else { this.currentSize = 0; this.currentIndex = 0; } this.maxDataPoints = options.maxDataPoints; if (data && (typeof(data) == "object") && Array.isArray(data)) { data.forEach( function (item) { this.addItem(item) }, this ); this.currentSize += 1; this.currentIndex += 1; } // reset timeBase for zero-filled values if needed this.timeBase -= (this.maxDataPoints - this.currentSize) * this.timeInterval; // zero-fill up to maxDataPoints size if we don't have that much data yet if ((typeof(this.maxDataPoints) !== 'undefined') && (this.currentSize < this.maxDataPoints)) { for (var i = this.maxDataPoints - this.currentSize - 1; i > 1; i--) { this.currentSize += 1; this.currentIndex += 1; this.forEach( function (item) { item.data.unshift({ x: ((i-1) * this.timeInterval || 1) + this.timeBase, y: 0, i: i }); }, this ); } } }, addData: function($super, data, x) { $super(data, x); this.currentSize += 1; this.currentIndex += 1; if (this.maxDataPoints !== undefined) { while (this.currentSize > this.maxDataPoints) { this.dropData(); } } }, dropData: function() { this.forEach(function(item) { item.data.splice(0, 1); } ); this.currentSize -= 1; }, getIndex: function () { return this.currentIndex; } } ); rickshaw-1.4.6/src/js/Rickshaw.Series.js000066400000000000000000000063331225123340100201000ustar00rootroot00000000000000Rickshaw.namespace('Rickshaw.Series'); Rickshaw.Series = Rickshaw.Class.create( Array, { initialize: function (data, palette, options) { options = options || {}; this.palette = new Rickshaw.Color.Palette(palette); this.timeBase = typeof(options.timeBase) === 'undefined' ? Math.floor(new Date().getTime() / 1000) : options.timeBase; var timeInterval = typeof(options.timeInterval) == 'undefined' ? 1000 : options.timeInterval; this.setTimeInterval(timeInterval); if (data && (typeof(data) == "object") && Array.isArray(data)) { data.forEach( function(item) { this.addItem(item) }, this ); } }, addItem: function(item) { if (typeof(item.name) === 'undefined') { throw('addItem() needs a name'); } item.color = (item.color || this.palette.color(item.name)); item.data = (item.data || []); // backfill, if necessary if ((item.data.length === 0) && this.length && (this.getIndex() > 0)) { this[0].data.forEach( function(plot) { item.data.push({ x: plot.x, y: 0 }); } ); } else if (item.data.length === 0) { item.data.push({ x: this.timeBase - (this.timeInterval || 0), y: 0 }); } this.push(item); if (this.legend) { this.legend.addLine(this.itemByName(item.name)); } }, addData: function(data, x) { var index = this.getIndex(); Rickshaw.keys(data).forEach( function(name) { if (! this.itemByName(name)) { this.addItem({ name: name }); } }, this ); this.forEach( function(item) { item.data.push({ x: x || (index * this.timeInterval || 1) + this.timeBase, y: (data[item.name] || 0) }); }, this ); }, getIndex: function () { return (this[0] && this[0].data && this[0].data.length) ? this[0].data.length : 0; }, itemByName: function(name) { for (var i = 0; i < this.length; i++) { if (this[i].name == name) return this[i]; } }, setTimeInterval: function(iv) { this.timeInterval = iv / 1000; }, setTimeBase: function (t) { this.timeBase = t; }, dump: function() { var data = { timeBase: this.timeBase, timeInterval: this.timeInterval, items: [] }; this.forEach( function(item) { var newItem = { color: item.color, name: item.name, data: [] }; item.data.forEach( function(plot) { newItem.data.push({ x: plot.x, y: plot.y }); } ); data.items.push(newItem); } ); return data; }, load: function(data) { if (data.timeInterval) { this.timeInterval = data.timeInterval; } if (data.timeBase) { this.timeBase = data.timeBase; } if (data.items) { data.items.forEach( function(item) { this.push(item); if (this.legend) { this.legend.addLine(this.itemByName(item.name)); } }, this ); } } } ); Rickshaw.Series.zeroFill = function(series) { Rickshaw.Series.fill(series, 0); }; Rickshaw.Series.fill = function(series, fill) { var x; var i = 0; var data = series.map( function(s) { return s.data } ); while ( i < Math.max.apply(null, data.map( function(d) { return d.length } )) ) { x = Math.min.apply( null, data .filter(function(d) { return d[i] }) .map(function(d) { return d[i].x }) ); data.forEach( function(d) { if (!d[i] || d[i].x != x) { d.splice(i, 0, { x: x, y: fill }); } } ); i++; } }; rickshaw-1.4.6/src/js/Rickshaw.js000066400000000000000000000014111225123340100166370ustar00rootroot00000000000000/* jshint -W079 */ var Rickshaw = { namespace: function(namespace, obj) { var parts = namespace.split('.'); var parent = Rickshaw; for(var i = 1, length = parts.length; i < length; i++) { var currentPart = parts[i]; parent[currentPart] = parent[currentPart] || {}; parent = parent[currentPart]; } return parent; }, keys: function(obj) { var keys = []; for (var key in obj) keys.push(key); return keys; }, extend: function(destination, source) { for (var property in source) { destination[property] = source[property]; } return destination; }, clone: function(obj) { return JSON.parse(JSON.stringify(obj)); } }; if (typeof module !== 'undefined' && module.exports) { var d3 = require('d3'); module.exports = Rickshaw; } rickshaw-1.4.6/tests/000077500000000000000000000000001225123340100144705ustar00rootroot00000000000000rickshaw-1.4.6/tests/Rickshaw.Class.js000066400000000000000000000021211225123340100176410ustar00rootroot00000000000000var Rickshaw = require('../rickshaw'); exports.load = function(test) { test.equal(typeof Rickshaw.Class, 'object', 'Rickshaw.Class is a function'); test.done(); }; exports.instantiation = function(test) { Rickshaw.namespace('Rickshaw.Sample.Class'); Rickshaw.Sample.Class = Rickshaw.Class.create({ name: 'sample', concat: function(suffix) { return [this.name, suffix].join(' '); } }); var sample = new Rickshaw.Sample.Class(); test.equal(sample.concat('polka'), 'sample polka'); Rickshaw.namespace('Rickshaw.Sample.Class.Prefix'); Rickshaw.Sample.Subclass = Rickshaw.Class.create( Rickshaw.Sample.Class, { name: 'sampler' }); var sampler = new Rickshaw.Sample.Subclass(); test.equal(sampler.concat('polka'), 'sampler polka'); test.done(); }; exports.array = function(test) { Rickshaw.namespace('Rickshaw.Sample.Array'); Rickshaw.Sample.Array = Rickshaw.Class.create(Array, { second: function() { return this[1]; } }); var array = new Rickshaw.Sample.Array(); array.push('red'); array.push('blue'); test.equal(array.second(), 'blue'); test.done(); }; rickshaw-1.4.6/tests/Rickshaw.Fixtures.Time.Local.js000066400000000000000000000027171225123340100223460ustar00rootroot00000000000000process.env.TZ = 'America/New_York'; var Rickshaw = require('../rickshaw'); var time = new Rickshaw.Fixtures.Time.Local; exports.monthBoundary = function(test) { var february = 1359694800; var ceil = time.ceil(february, time.unit('month')); test.equal(ceil, february, "february resolves to itself"); test.done(); }; exports.monthMinus = function(test) { var february = 1359694800; var ceil = time.ceil(february - 1, time.unit('month')); test.equal(ceil, february, "just before february resolves up to february"); test.done(); }; exports.month = function(test) { var february = 1359694800; var march = 1362114000; var ceil = time.ceil(february + 1, time.unit('month')); test.equal(ceil, march, "february plus a bit resolves to march"); test.done(); }; exports.decemberMonthWrap = function(test) { var december2013 = 1385874000; var january2014 = 1388552400; var ceil = time.ceil(december2013 + 1, time.unit('month')); test.equal(ceil, january2014, "december wraps to next year"); test.done(); }; exports.yearBoundary = function(test) { var year2013 = 1357016400; var ceil = time.ceil(year2013, time.unit('year')); test.equal(ceil, year2013, "midnight new year resolves to itself"); test.done(); }; exports.year = function(test) { var year2013 = 1357016400; var year2014 = 1388552400; var ceil = time.ceil(year2013 + 1, time.unit('year')); test.equal(ceil, year2014, "midnight new year plus a bit resolves to next year"); test.done(); }; rickshaw-1.4.6/tests/Rickshaw.Fixtures.Time.js000066400000000000000000000026431225123340100213130ustar00rootroot00000000000000var Rickshaw = require('../rickshaw'); var time = new Rickshaw.Fixtures.Time; exports.monthBoundary = function(test) { var february = 1359676800; var ceil = time.ceil(february, time.unit('month')); test.equal(ceil, february, "february resolves to itself"); test.done(); }; exports.monthMinus = function(test) { var february = 1359676800; var ceil = time.ceil(february - 1, time.unit('month')); test.equal(ceil, february, "just before february resolves up to february"); test.done(); }; exports.month = function(test) { var february = 1359676800; var march = 1362096000; var ceil = time.ceil(february + 1, time.unit('month')); test.equal(ceil, march, "february plus a bit resolves to march"); test.done(); }; exports.decemberMonthWrap = function(test) { var december2013 = 1385856000; var january2014 = 1388534400; var ceil = time.ceil(december2013 + 1, time.unit('month')); test.equal(ceil, january2014, "december wraps to next year"); test.done(); }; exports.yearBoundary = function(test) { var year2013 = 1356998400; var ceil = time.ceil(year2013, time.unit('year')); test.equal(ceil, year2013, "midnight new year resolves to itself"); test.done(); }; exports.year = function(test) { var year2013 = 1356998400; var year2014 = 1388534400; var ceil = time.ceil(year2013 + 1, time.unit('year')); test.equal(ceil, year2014, "midnight new year plus a bit resolves to next year"); test.done(); }; rickshaw-1.4.6/tests/Rickshaw.Graph.Axis.X.js000066400000000000000000000014601225123340100207530ustar00rootroot00000000000000var Rickshaw; exports.setUp = function(callback) { Rickshaw = require('../rickshaw'); global.document = d3.select('html')[0][0].parentNode; global.window = document.defaultView; new Rickshaw.Compat.ClassList(); callback(); }; exports.tearDown = function(callback) { delete require.cache.d3; callback(); }; exports.axis = function(test) { var element = document.createElement('div'); var graph = new Rickshaw.Graph({ width: 900, element: element, series: [ { data: [ { x: 4, y: 32 }, { x: 16, y: 100 } ] } ] }); var xAxis = new Rickshaw.Graph.Axis.X({ graph: graph }); xAxis.render(); var ticks = d3.select(element).selectAll('.x_grid_d3 .tick') test.equal(ticks[0].length, 13, "we have some ticks"); test.equal(ticks[0][0].getAttribute('data-x-value'), '4'); test.done(); }; rickshaw-1.4.6/tests/Rickshaw.Graph.Axis.Y.js000066400000000000000000000014741225123340100207610ustar00rootroot00000000000000var Rickshaw; exports.setUp = function(callback) { Rickshaw = require('../rickshaw'); global.document = d3.select('html')[0][0].parentNode; global.window = document.defaultView; new Rickshaw.Compat.ClassList(); callback(); }; exports.tearDown = function(callback) { delete require.cache.d3; callback(); }; exports.axis = function(test) { var element = document.createElement('div'); var graph = new Rickshaw.Graph({ width: 900, height: 600, element: element, series: [ { data: [ { x: 4, y: 32 }, { x: 16, y: 100 } ] } ] }); var yAxis = new Rickshaw.Graph.Axis.Y({ graph: graph }); yAxis.render(); var ticks = d3.select(element).selectAll('.y_grid .tick') test.equal(ticks[0].length, 11, "we have some ticks"); test.equal(ticks[0][0].getAttribute('data-y-value'), '0'); test.done(); }; rickshaw-1.4.6/tests/Rickshaw.Graph.Legend.js000066400000000000000000000040411225123340100210350ustar00rootroot00000000000000var Rickshaw; exports.setUp = function(callback) { Rickshaw = require('../rickshaw'); global.document = d3.select('html')[0][0].parentNode; global.window = document.defaultView; new Rickshaw.Compat.ClassList(); var el = document.createElement("div"); this.graph = new Rickshaw.Graph({ element: el, width: 960, height: 500, renderer: 'stack', series: [ { name: 'foo', data: [ { x: 4, y: 32 } ] }, { name: 'bar', data: [ { x: 4, y: 32 } ] } ] }); this.legendEl = document.createElement("div"); callback(); }; exports.tearDown = function(callback) { delete require.cache.d3; callback(); }; exports.rendersLegend = function(test) { var legend = new Rickshaw.Graph.Legend({ graph: this.graph, element: this.legendEl }); var items = this.legendEl.getElementsByTagName('li') test.equal(items.length, 2, "legend count") test.equal(items[1].getElementsByClassName('label')[0].innerHTML, "foo") test.equal(items[0].getElementsByClassName('label')[0].innerHTML, "bar") test.done(); }; exports.hasDefaultClassName = function(test) { var legend = new Rickshaw.Graph.Legend({ graph: this.graph, element: this.legendEl }); test.equal(this.legendEl.className, "rickshaw_legend") test.done(); }; exports.canOverrideClassName = function(test) { var MyLegend = Rickshaw.Class.create( Rickshaw.Graph.Legend, { className: 'fnord' }); var legend = new MyLegend({ graph: this.graph, element: this.legendEl }); test.equal(this.legendEl.className, "fnord") test.done(); }; exports['should put series classes on legend elements'] = function(test) { this.graph.series[0].className = 'fnord-series-0'; this.graph.series[1].className = 'fnord-series-1'; var legend = new Rickshaw.Graph.Legend({ graph: this.graph, element: this.legendEl }); test.equal(d3.select(this.legendEl).selectAll('.line').size(), 2); test.equal(d3.select(this.legendEl).selectAll('.fnord-series-0').size(), 1); test.equal(d3.select(this.legendEl).selectAll('.fnord-series-1').size(), 1); test.done(); };rickshaw-1.4.6/tests/Rickshaw.Graph.RangeSlider.Preview.js000066400000000000000000000016441225123340100234640ustar00rootroot00000000000000exports.setUp = function(callback) { Rickshaw = require('../rickshaw'); global.document = d3.select('html')[0][0].parentNode; global.window = document.defaultView; new Rickshaw.Compat.ClassList(); callback(); }; exports.tearDown = function(callback) { delete require.cache.d3; callback(); }; exports.basic = function(test) { var el = document.createElement("div"); var graph = new Rickshaw.Graph({ element : el, width : 960, height : 500, renderer : 'scatterplot', series : [{ color : 'steelblue', data : [ { x: 0, y: 40 }, { x: 1, y: 49 }, { x: 2, y: 38 }, { x: 3, y: 30 }, { x: 4, y: 32 } ] }] } ); graph.renderer.dotSize = 6; graph.render(); var previewElement = document.createElement("div"); test.doesNotThrow(function() { var preview = new Rickshaw.Graph.RangeSlider.Preview({ element: previewElement, graph: graph }); }); test.done(); }; rickshaw-1.4.6/tests/Rickshaw.Graph.Renderer.Scatterplot.js000066400000000000000000000011041225123340100237050ustar00rootroot00000000000000var Rickshaw = require("../rickshaw"); exports["should add the series className to all scatterplot points"] = function(test) { var el = document.createElement("div"); var graph = new Rickshaw.Graph({ element: el, stroke: true, width: 10, height: 10, renderer: 'scatterplot', series: [ { className: 'fnord', data: [ { x: 0, y: 40 }, { x: 1, y: 49 }, { x: 2, y: 38 }, { x: 3, y: 30 }, { x: 4, y: 32 } ] } ] }); graph.render() var path = graph.vis.selectAll('circle.fnord') test.equals(5, path.size()) test.done() } rickshaw-1.4.6/tests/Rickshaw.Graph.Renderer.js000066400000000000000000000102031225123340100214020ustar00rootroot00000000000000var Rickshaw = require("../rickshaw"); exports.domain = function(test) { // document comes from jsdom var el = document.createElement("div"); var graph = new Rickshaw.Graph({ element: el, width: 960, height: 500, padding: { top: 0, right: 0, bottom: 0, left: 0 }, renderer: 'scatterplot', series: [ { color: 'steelblue', data: [ { x: 0, y: 40 }, { x: 1, y: 49 }, { x: 2, y: 38 }, { x: 3, y: 30 }, { x: 4, y: 32 } ] } ] }); var domain = graph.renderer.domain(); test.deepEqual(domain, { x: [ 0, 4 ], y: [ 0, 49 ] }, 'domain matches'); // with padding graph.configure({ padding: { top: 0.1, right: 0.1, bottom: 0.1, left: 0.1 }}); domain = graph.renderer.domain(); test.deepEqual(domain, { x: [ -0.4, 4.44 ], y: [ 0, 49 + 4.9 ] }, 'domain matches with padding'); // negative y-values minus auto graph.series[0].data[2].y = -72; graph.configure({ padding: { top: 0, right: 0, bottom: 0, left: 0 }}); domain = graph.renderer.domain(); test.deepEqual(domain, { x: [ 0, 4 ], y: [ 0, 49 ] }, 'domain matches with negative numbers and no auto'); // negative y-values w/ auto graph.series[0].data[2].y = -72; graph.configure({ padding: { top: 0, right: 0, bottom: 0, left: 0 }, min: 'auto'}); domain = graph.renderer.domain(); test.deepEqual(domain, { x: [ 0, 4 ], y: [ -72, 49 ] }, 'domain matches with negative numbers and min auto'); // different series lengths graph.series.push({ color: 'lightblue', data: [ { x: 1, y: 20 }, { x: 2, y: 38 }, { x: 3, y: 30 }, { x: 4, y: 32 }, { x: 5, y: 32 } ] }); graph.stackData(); domain = graph.renderer.domain(); test.deepEqual(domain, { x: [ 0, 5 ], y: [ -72, 49 ] }, 'multiple length series extents match'); // null values and auto graph.series.splice(0, graph.series.length); graph.series.push({ data: [ { x: 1, y: 27 }, { x: 2, y: 49 }, { x: 3, y: 14 } ] }); graph.series.push({ data: [ { x: 1, y: null }, { x: 2, y: 9 }, { x: 3, y: 3 } ] }); graph.configure({ min: 'auto' }); graph.stackData(); domain = graph.renderer.domain(); test.deepEqual(domain, { x: [ 1, 3 ], y: [ 3, 49 ] }, "null values don't set min to zero"); // max of zero graph.series.push({ data: [ { x: 1, y: -29 }, { x: 2, y: -9 }, { x: 3, y: -3 } ] }); graph.configure({ max: 0 }); graph.stackData(); domain = graph.renderer.domain(); test.deepEqual(domain, { x: [ 1, 3 ], y: [ -29, 0 ] }, "explicit zero max doesn't fall through"); test.done(); }; exports.respectStrokeFactory = function(test) { var el = document.createElement("div"); Rickshaw.Graph.Renderer.RespectStrokeFactory = Rickshaw.Class.create( Rickshaw.Graph.Renderer, { name: 'respectStrokeFactory', seriesPathFactory: function() { var graph = this.graph; var factory = d3.svg.line() .x( function(d) { return graph.x(d.x) } ) .y( function(d) { return graph.y(d.y + d.y0) } ) .interpolate(graph.interpolation).tension(this.tension); factory.defined && factory.defined( function(d) { return d.y !== null } ); return factory; }, seriesStrokeFactory: function() { var graph = this.graph; var factory = d3.svg.line() .x( function(d) { return graph.x(d.x) } ) .y( function(d) { return graph.y(d.y + d.y0) } ) .interpolate(graph.interpolation).tension(this.tension); factory.defined && factory.defined( function(d) { return d.y !== null } ); return factory; } }); var graph = new Rickshaw.Graph({ element: el, stroke: true, width: 10, height: 10, renderer: 'respectStrokeFactory', series: [ { className: 'fnord', data: [ { x: 0, y: 40 }, { x: 1, y: 49 }, { x: 2, y: 38 }, { x: 3, y: 30 }, { x: 4, y: 32 } ] } ] }); graph.render(); var path = graph.vis.select('path.path.fnord'); test.equals(path.size(), 1, "we have a fnord path"); var stroke = graph.vis.select('path.stroke.fnord'); test.equals(stroke.size(), 1, "we have a fnord stroke"); // should also be availeable via series var firstSeries = graph.series[0]; test.ok(d3.select(firstSeries.path).classed('path'), "selectable path"); test.ok(d3.select(firstSeries.stroke).classed('stroke', "selectable stroke")); test.done(); }; rickshaw-1.4.6/tests/Rickshaw.Graph.js000066400000000000000000000146401225123340100176460ustar00rootroot00000000000000var fs = require('fs'); var Rickshaw; exports.setUp = function(callback) { Rickshaw = require('../rickshaw'); global.document = d3.select('html')[0][0].parentNode; global.window = document.defaultView; new Rickshaw.Compat.ClassList(); callback(); }; exports.tearDown = function(callback) { delete require.cache.d3; callback(); }; exports.svg = function(test) { var el = document.createElement("div"); var graph = new Rickshaw.Graph({ element : el, width : 960, height : 500, renderer : 'scatterplot', series : [{ color : 'steelblue', data : [ { x: 0, y: 40 }, { x: 1, y: 49 }, { x: 2, y: 38 }, { x: 3, y: 30 }, { x: 4, y: 32 } ] }] } ); graph.renderer.dotSize = 6; graph.render(); var generatedSVG = el.innerHTML; var exampleSVGFilename = __dirname + '/data/simple.svg'; var exampleSVG = fs.readFileSync(exampleSVGFilename, 'utf8').trim(); test.equal(generatedSVG, exampleSVG, "simple graph svg content matches"); test.done(); }; exports.validate = function(test) { var el = document.createElement("div"); test.throws( function() { var graph = new Rickshaw.Graph({ element: el, width: 960, height: 500, series: [{ color : 'steelblue', data : [ { x: 0, y: 40 }, { x: 5, y: 49 }, { x: 2, y: 38 }, { x: 3, y: 30 }, { x: 4, y: 32 } ] }] } ); }, null, "out of order data points throws an error" ); test.done(); }; exports.scales = function(test) { var el = document.createElement("div"); var times = [1380000000000, 1390000000000]; var series = [ { color: 'steelblue', data: [ { x: times[0], y: 40 }, { x: times[1], y: 49 } ] } ]; var graph = new Rickshaw.Graph({ element: el, width: 960, height: 500, xScale: d3.time.scale(), yScale: d3.scale.sqrt(), series: series }); graph.render(); var xAxis = new Rickshaw.Graph.Axis.X({ graph: graph, tickFormat: graph.x.tickFormat() }); xAxis.render(); var yAxis = new Rickshaw.Graph.Axis.Y({ graph: graph }); yAxis.render(); test.ok(graph.x.ticks()[0] instanceof Date); var xTicks = el.getElementsByClassName('x_ticks_d3')[0].getElementsByTagName('text'); test.equal(xTicks[0].innerHTML, 'Sep 29'); test.equal(xTicks[1].innerHTML, 'Oct 06'); test.equal(xTicks[8].innerHTML, 'Nov 24'); var yTicks = el.getElementsByClassName('y_ticks')[0].getElementsByTagName('g'); test.equal(yTicks[0].getAttribute('transform'), 'translate(0,500)'); test.equal(yTicks[1].getAttribute('transform'), 'translate(0,275.24400874015976)'); test.equal(yTicks[2].getAttribute('transform'), 'translate(0,182.14702893572513)'); test.done(); }; exports.inconsistent = function(test) { var el = document.createElement("div"); var series = [ { color: 'steelblue', data: [ { x: 0, y: 40 }, { x: 1, y: 49 }, { x: 2, y: 38 } ] }, { color: 'red', data: [ { x: 0, y: 40 }, { x: 1, y: 49 }, { x: 2, y: 38 } ] } ]; test.doesNotThrow( function() { var graph = new Rickshaw.Graph({ element: el, width: 960, height: 500, renderer: 'stack', series: series }); }, "create basic graph okay" ); series[0].data.push( { x: 3, y: 88 } ); test.doesNotThrow( function() { var graph = new Rickshaw.Graph({ element: el, width: 960, height: 500, renderer: 'line', series: series }); }, "we don't throw for inconsistent length series for lines" ); test.throws( function() { var graph = new Rickshaw.Graph({ element: el, width: 960, height: 500, renderer: 'stack', series: series }); }, null, "throw for inconsistent stacked series for stack renderer" ); test.throws( function() { var graph = new Rickshaw.Graph({ element: null, width: 960, height: 500, renderer: 'stack', series: series }); }, null, "throw an error for undefined element reference" ); test.done(); }; exports.configure = function(test) { var el = document.createElement('div'); var graph = new Rickshaw.Graph({ element: el, width: 960, height: 500, padding: { top: 0.2 }, renderer: 'stack', series: [ { data: [ { x: 1, y: 40 } ] } ] }); test.deepEqual(graph.renderer.padding, { bottom: 0.01, right: 0, left: 0, top: 0.2 }, "padding makes it through to renderer from constructor"); test.strictEqual(typeof graph.padding, "undefined", "padding not set on graph from constructor"); graph.configure({ padding: { top: 0.25, bottom: 0.25, right: 0.25, left: 0.25 } }); test.deepEqual(graph.renderer.padding, { bottom: 0.25, right: 0.25, left: 0.25, top: 0.25 }, "padding makes it through to renderer from configure"); test.strictEqual(typeof graph.padding, "undefined", "padding not set on graph from configure"); var callback = function(args) { if (callback.called) return; test.deepEqual(args, { interpolation: 'step-after' }, "configure args match"); callback.called = true; }; graph.onConfigure(callback); graph.configure({ interpolation: 'step-after' }); test.equal(graph.interpolation, 'step-after', "interpolation set on graph"); test.ok(callback.called, "configure callback was called"); test.equal(graph.config.interpolation, 'step-after', "configuration object has interpolation set"); graph.configure({ width: 900, height: 100 }); test.deepEqual([ graph.width, graph.height ], [ 900, 100 ], "graph dimensions take"); test.deepEqual(graph.vis[0][0].getAttribute('width'), 900, "width set on svg"); test.deepEqual(graph.vis[0][0].getAttribute('height'), 100, "height set on svg"); test.done(); }; exports.rendererAutodiscover = function(test) { var Rickshaw = require('../rickshaw'); new Rickshaw.Compat.ClassList(); var el = document.createElement("div"); var series = [ { color: 'steelblue', data: [ { x: 0, y: 40 }, { x: 1, y: 49 }, { x: 2, y: 38 } ] }, { color: 'red', data: [ { x: 0, y: 40 }, { x: 1, y: 49 }, { x: 2, y: 38 } ] } ]; test.throws( function() { var graph = new Rickshaw.Graph({ element: el, width: 960, height: 500, renderer: 'testline', series: series }); }, null, "throw for unknown renderer" ); Rickshaw.namespace('Rickshaw.Graph.Renderer.TestLine'); Rickshaw.Graph.Renderer.TestLine = Rickshaw.Class.create( Rickshaw.Graph.Renderer.Line, { name: 'testline' } ); test.doesNotThrow( function() { var graph = new Rickshaw.Graph({ element: el, width: 960, height: 500, renderer: 'testline', series: series }); }, "new render autodiscovered ok" ); delete Rickshaw.Graph.Renderer.TestLine; test.done(); }; rickshaw-1.4.6/tests/Rickshaw.Series.FixedDuration.js000066400000000000000000000032101225123340100225720ustar00rootroot00000000000000var Rickshaw = require("../rickshaw"); function seriesData() { return { name: 'series1', data: [ {x: 0, y: 20}, {x: 1, y: 21}, { x: 2, y: 15} ], color: 'red' }; } exports.basic = function(test) { test.equal(typeof Rickshaw.Series.FixedDuration, 'function', 'Rickshaw.Series.FixedDuration is a function'); test.done(); }; exports.initialize = function(test) { function instantiateMalformed() { var series = new Rickshaw.Series.FixedDuration( [seriesData()], 'spectrum2001', { timeBase: 0, maxDataPoints: 2000 } ); } test.throws(instantiateMalformed, 'FixedDuration series requires timeInterval', 'we die without a timeInterval'); function instantiateMalformed2() { var series = new Rickshaw.Series.FixedDuration( [seriesData()], 'spectrum2001', { timeBase: 0, timeInterval: 30 } ); } test.throws(instantiateMalformed2, 'FixedDuration series requires maxDataPoints', 'we die without maxDataPoints'); var series = new Rickshaw.Series.FixedDuration( [seriesData()], 'spectrum2001', { timeBase: 0, timeInterval: 30, maxDataPoints: 2000 } ); test.ok(series instanceof Rickshaw.Series.FixedDuration); test.ok(series instanceof Array); test.done(); }; exports.addData = function(test) { var series = new Rickshaw.Series.FixedDuration( [seriesData()], 'spectrum2001', { timeBase: 0, timeInterval: 1, maxDataPoints: 20 } ); for (var i = 0; i < 300; i++) { series.addData({series1: 42}); } test.equal(series[0].data.length, 20 + 2, 'series length stuck around maxDataPoints'); test.equal(series.currentSize, 20, 'series.currentSize is stuck at maxDataPoints'); test.done(); }; rickshaw-1.4.6/tests/Rickshaw.Series.js000066400000000000000000000107311225123340100200340ustar00rootroot00000000000000var Rickshaw = require("../rickshaw"); function seriesData() { return { name: 'series1', data: [ {x: 0, y: 20}, {x: 1, y: 21}, { x: 2, y: 15} ], color: 'red' }; } exports.basic = function(test) { test.equal(typeof Rickshaw.Series, 'function', 'Rickshaw.Series is a function'); test.done(); }; exports.initialize = function(test) { var series = new Rickshaw.Series([seriesData()], 'spectrum2001', {timeBase: 0}); test.ok(series instanceof Rickshaw.Series); test.ok(series instanceof Array); test.deepEqual( series[0].data, [ { x: 0, y: 20 }, { x: 1, y: 21 }, { x: 2, y: 15 } ], 'data made it in as we expect' ); test.done(); }; exports.addItem = function(test) { var series = new Rickshaw.Series([seriesData()], 'spectrum2001', {timeBase: 0}); series.addItem( { name: 'series2', data: [ {x: 0, y: 10}, {x: 1, y: 13}, {x: 2, y: 12} ] } ); test.equal(series.length, 2, 'series has two items'); test.done(); }; exports.addData = function(test) { var series = new Rickshaw.Series([seriesData()], 'spectrum2001', {timeBase: 0}); series.addData( { series1: 22 } ); test.equal(series[0].data.length, 4, 'first series has four data points'); test.equal(series[0].data[3].y, 22, 'first series last data point made it in'); series.addData( { series1: 29, series2: 57 } ); test.equal(series[0].data[4].y, 29, 'first series has a new data point'); test.equal(series[1].data.length, 5, 'second series has five data points'); test.equal(series[1].data[4].y, 57, 'second series last data point made it in'); test.done(); }; exports.addDataWithXAxisValue = function(test) { var series = new Rickshaw.Series([seriesData()], 'spectrum2001', {timeBase: 0}); series.addData({ series1: 22 }, 5); test.equal(series[0].data.length, 4, 'first series has four data points'); test.equal(series[0].data[3].y, 22, 'first series last data point made it in'); test.equal(series[0].data[3].x, 5, 'first series last data point made it in with the correct x'); series.addData({ series1: 29, series2: 57 }, 7); test.equal(series[0].data[4].y, 29, 'first series has a new data point'); test.equal(series[0].data[4].x, 7, 'first series has a new data point with the correct x'); test.equal(series[1].data.length, 5, 'second series has five data points'); test.equal(series[1].data[4].y, 57, 'second series last data point made it in'); test.equal(series[1].data[4].x, 7, 'second series last data point made it in with the correct x'); test.done(); }; exports.itemByName = function(test) { var series = new Rickshaw.Series([seriesData()], 'spectrum2001', {timeBase: 0}); test.strictEqual(series.itemByName('series1'), series[0], 'we get the right item'); test.strictEqual(series.itemByName('series1').name, 'series1', 'item by name is right'); test.done(); }; exports.dump = function(test) { var series = new Rickshaw.Series([seriesData()], 'spectrum2001', {timeBase: 0}); test.deepEqual( series.dump(), { "timeBase":0, "timeInterval": 1, "items":[{ "color":"red", "name":"series1", "data":[{"x":0,"y":20},{"x":1,"y":21},{"x":2,"y":15}] }] }, 'dumped series matches' ); test.done(); }; exports.zeroFill = function(test) { var series = [ { name: "series1", data: [{ x: 1, y: 22 }, { x: 3, y: 29 }] }, { name: "series2", data: [{ x: 2, y: 49 }] } ]; Rickshaw.Series.zeroFill(series); var expectedSeries = [ { name: "series1", data: [{ x: 1, y: 22 }, { x: 2, y: 0 }, { x: 3, y: 29 }] }, { name: "series2", data: [{ x: 1, y: 0}, { x: 2, y: 49 }, { x: 3, y: 0 }] } ]; test.deepEqual(series, expectedSeries, "zero fill fills in zeros"); test.done(); }; exports.nullFill = function(test) { var series = [ { name: "series1", data: [{ x: 1, y: 22 }, { x: 3, y: 29 }] }, { name: "series2", data: [{ x: 2, y: 49 }] } ]; Rickshaw.Series.fill(series, null); var expectedSeries = [ { name: "series1", data: [{ x: 1, y: 22 }, { x: 2, y: null }, { x: 3, y: 29 }] }, { name: "series2", data: [{ x: 1, y: null}, { x: 2, y: 49 }, { x: 3, y: null }] } ]; test.deepEqual(series, expectedSeries, "null fill fills in nulls"); test.done(); }; exports.load = function(test) { var series = new Rickshaw.Series([], 'spectrum2001', {timeBase: 0}); series.load({ items: [ seriesData() ], timeInterval: 3, timeBase: 0 }); delete series.palette; test.equal(series.timeBase, 0, 'time base made it in'); test.equal(series.timeInterval, 3, 'time interval made it in'); test.equal(series[0].data.length, 3, 'series data made it in'); test.done(); }; rickshaw-1.4.6/tests/data/000077500000000000000000000000001225123340100154015ustar00rootroot00000000000000rickshaw-1.4.6/tests/data/simple.svg000066400000000000000000000007261225123340100174200ustar00rootroot00000000000000 rickshaw-1.4.6/tutorial/000077500000000000000000000000001225123340100151715ustar00rootroot00000000000000rickshaw-1.4.6/tutorial/example_01.html000066400000000000000000000007131225123340100200130ustar00rootroot00000000000000
rickshaw-1.4.6/tutorial/example_02.html000066400000000000000000000012571225123340100200200ustar00rootroot00000000000000
rickshaw-1.4.6/tutorial/example_03.html000066400000000000000000000015311225123340100200140ustar00rootroot00000000000000
rickshaw-1.4.6/tutorial/example_04.html000066400000000000000000000024421225123340100200170ustar00rootroot00000000000000
rickshaw-1.4.6/tutorial/example_05.html000066400000000000000000000051301225123340100200150ustar00rootroot00000000000000
rickshaw-1.4.6/tutorial/example_06.html000066400000000000000000000054441225123340100200260ustar00rootroot00000000000000
rickshaw-1.4.6/tutorial/example_07.html000066400000000000000000000065671225123340100200360ustar00rootroot00000000000000

rickshaw-1.4.6/tutorial/introduction.html000066400000000000000000000171631225123340100206100ustar00rootroot00000000000000

Taking Rickshaw for a Go

Rickshaw builds on top of D3 technically, and spiritually too. Rickshaw makes every effort to provide help for common problems without obscuring anything underneath it. If you need to reach down to D3 or the SVG layers below, go right ahead -- it's all there waiting.

Let's start with a simple but complete program that paints a chart:

view

Example 01


Breaking that down, first we pull in our dependencies and create a div to hold our chart. Then in our script we call Rickshaw.Graph's constructor, and pass along an element reference to our chart container, some layout instructions, and a series of data objects.

The series object has a couple of slots, a data array of coordinate objects, and a color to draw them with. Finally, we call the render() method on our just instantiated graph object, which creates paints our chart on the screen.

Let's Try with Real Data

Our previous work allowed us to paint a chart of made up values with minimal scaffolding. That was fun, but it doesn't tell us anything interesting about data. Let's use population change data from the 2010 U.S. Census to power our chart, and see what we find.

We'll begin by drawing a line representing the United States population with a point for each decade from 1910 to 2010. We'll use a short script we've written to massage the CSV data at the census.gov URL into a JavaScript data structure that Rickshaw.Graph's constructor can take as its data argument.


view

Example 02


Time on the X-Axis

A trained eye can already see some points of interest there. For instance, ending about a quarter way into the graph there is a short period where the growth rate flattens out significantly. What happened then?

First we have to answer the question of when the flattening happened. Putting a label on our x axis should help. Rickshaw gives us a helper for time based axes. After we modify our data transformation script to use epoch seconds for the x values we can pass our graph along to Rickshaw.Graph.Axis.Time's constructor. When the graph's render() function is later called Rickshaw examines the x domain and determines the time unit being used, and labels the graph accordingly. The styling we included lines up the labels nicely across the bottom of our graph.

Our updated transform_epoch.pl uses epoch seconds for x. Let's see how we do.


view

Example 03


Y-Axis Too

Now let's add the pieces to get a y axis. We need a new HTML element to put the y axis in, as well as some styling to position the axis absolutely in relation to the chart.

We pass along a reference to our graph to Rickshaw.Graph.Axis.Y's constructor, as well as the element we want to draw the axis inside. We also ask Rickshaw.Fixtures.Number.formatKMBT to help us format the numbers on our y ticks in there.

view

Example 04



Breaking Things Down

The Great Depression left a mark. We should break that data down by region. Some simple changes to our data transformation gives us the regional data for our series. Here's transform_region.pl.

Plugging that data into our series parameter leaves us wanting to provide colors for each of those individual series. We'll use the Rickshaw.Color.Palette plugin to pick our colors. Once we've created our palette, calling its color() method returns the next color.


view

Example 05


What Are We Looking At?

We need a legend! Following a familiar pattern, we add a container div for the legend and style it. Then we call the constructor for the Rickshaw.Graph.Legend plugin, which takes a reference to our newly added DOM element, and a reference to the graph.


view

Example 06


Unstacking

It's clear that the South is growing quickly, but instead of painting this chart as a stacked graph it would be nice to see how these growth patterns line up against each other. We set the renderer in a callback, and then ask the graph to update.

In addition to setting the default renderer for the graph, we've added a little JavaScript to observe clicks between our stack/line toggle whose job is to update the type of renderer we're using and render the graph appropriately.


view

Example 07


More Later

We're just getting started, but that's all for today. Next time we'll get into stacked bars, and different line interpolations, and smoothing, and zooming.

If you're clamoring for more, you may enjoy a poke around in the examples directory.



rickshaw-1.4.6/tutorial/style.css000066400000000000000000000023431225123340100170450ustar00rootroot00000000000000body { width: 780px; margin: auto; font-family: Arial, Helvetica, sans-serif; font-size: 13px; color: #282828; line-height: 135%; } a { text-decoration: none; color: steelblue; } a:hover { color: lightblue; } h1 { margin: 1em 0 1em 0; font-weight: normal; } h2 { font-weight: normal; margin: 1.4em 0 1em 0; color: black; } .tutorial-chart { margin-left: 1%; vertical-align: top; margin-top: 1em; } code { background-color: #f0f0f0; padding: 2px; } section.example { border: 1px solid #e4e4e4; } pre.prettyprint { border: none; border-top: 1px solid #e8e8e8; background: #f0f0f0; padding: 14px 14px; margin: 0; white-space: pre-wrap; } section iframe { width: 580px; height: 270px; border: none; margin: 0 auto 12px auto; display: block; } section header { border-bottom: 1px solid #e8e8e8; color: #b0b0b0; margin: 0 0 16px 0; } section header a:hover { color: steelblue; } section header a { color: #d0d0d0; text-decoration: none; margin: 6px 10px 0 0; } section header h3 { font-weight: normal; margin: 0 0 10px 0; position: relative; padding: 6px 0 0 8px; pointer-events: none; } section header a { float: right; } .linenums { color: #d0d0d0; } #example_06 iframe, #example_07 iframe { width: 750px; } rickshaw-1.4.6/tutorial/transform.pl000077500000000000000000000006261225123340100175500ustar00rootroot00000000000000#!/usr/bin/env perl use warnings; use strict; my @header; my $data; while (<>) { # the third line is the header if ($. == 3) { # and we want the years @header = map { m/^(\d{4})/; $1; } (split ',')[1..11]; } if (m/^United States/) { my $i = -1; $data = "[ " . join(", ", map { "{ x: $header[++$i], y: $_ }" } (split ',')[1..11]) . " ]"; last; } } print $data; rickshaw-1.4.6/tutorial/transform_epoch.pl000077500000000000000000000010451225123340100207220ustar00rootroot00000000000000#!/usr/bin/env perl use warnings; use strict; use Time::Local 'timegm'; my @header; my $data; while (<>) { # the third line is the header if ($. == 3) { # and we want the years in epoch seconds @header = map { m/^(\d{4})/; year_to_seconds($1); } (split ',')[1..11]; } if (m/^United States/) { my $i = -1; $data = "[ " . join(", ", map { "{ x: $header[++$i], y: $_ }" } (split ',')[1..11]) . " ]"; last; } } sub year_to_seconds { my $year = shift; return timegm(0, 0, 0, 1, 0, $year); } print $data; rickshaw-1.4.6/tutorial/transform_region.pl000077500000000000000000000012521225123340100211070ustar00rootroot00000000000000#!/usr/bin/env perl use warnings; use strict; use Time::Local 'timegm'; my @header; my $data; while (<>) { # the third line is the header if ($. == 3) { # and we want the years in epoch seconds @header = map { m/^(\d{4})/; year_to_seconds($1); } (split ',')[1..11]; } if (m/^(Northeast|Midwest|South|West)/) { my $i = -1; $data .= "\n{\n\tname: \"$1\",\n"; $data .= "\tdata: [ " . join(", ", map { "{ x: $header[++$i], y: $_ }" } (split ',')[1..11]) . " ],\n\n},"; } chop $data && last if m/^Alabama/; # we have what we need now. } sub year_to_seconds { my $year = shift; return timegm(0, 0, 0, 1, 0, $year); } print "$data\n"; rickshaw-1.4.6/tutorial/vendor/000077500000000000000000000000001225123340100164665ustar00rootroot00000000000000rickshaw-1.4.6/tutorial/vendor/prettify/000077500000000000000000000000001225123340100203345ustar00rootroot00000000000000rickshaw-1.4.6/tutorial/vendor/prettify/prettify.css000066400000000000000000000012621225123340100227150ustar00rootroot00000000000000/* Pretty printing styles. Used with prettify.js. */ .str { color: #080; } .kwd { color: #008; } .com { color: #800; } .typ { color: #606; } .lit { color: #066; } .pun { color: #660; } .pln { color: #000; } .tag { color: #008; } .atn { color: #606; } .atv { color: #080; } .dec { color: #606; } pre.prettyprint { padding: 2px; border: 1px solid #888; } @media print { .str { color: #060; } .kwd { color: #006; font-weight: bold; } .com { color: #600; font-style: italic; } .typ { color: #404; font-weight: bold; } .lit { color: #044; } .pun { color: #440; } .pln { color: #000; } .tag { color: #006; font-weight: bold; } .atn { color: #404; } .atv { color: #060; } } rickshaw-1.4.6/tutorial/vendor/prettify/prettify.js000066400000000000000000001605261225123340100225520ustar00rootroot00000000000000// Copyright (C) 2006 Google Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /** * @fileoverview * some functions for browser-side pretty printing of code contained in html. *

* * For a fairly comprehensive set of languages see the * README * file that came with this source. At a minimum, the lexer should work on a * number of languages including C and friends, Java, Python, Bash, SQL, HTML, * XML, CSS, Javascript, and Makefiles. It works passably on Ruby, PHP and Awk * and a subset of Perl, but, because of commenting conventions, doesn't work on * Smalltalk, Lisp-like, or CAML-like languages without an explicit lang class. *

* Usage:

    *
  1. include this source file in an html page via * {@code } *
  2. define style rules. See the example page for examples. *
  3. mark the {@code
    } and {@code } tags in your source with
     *    {@code class=prettyprint.}
     *    You can also use the (html deprecated) {@code } tag, but the pretty
     *    printer needs to do more substantial DOM manipulations to support that, so
     *    some css styles may not be preserved.
     * </ol>
     * That's it.  I wanted to keep the API as simple as possible, so there's no
     * need to specify which language the code is in, but if you wish, you can add
     * another class to the {@code <pre>} or {@code <code>} element to specify the
     * language, as in {@code <pre class="prettyprint lang-java">}.  Any class that
     * starts with "lang-" followed by a file extension, specifies the file type.
     * See the "lang-*.js" files in this directory for code that implements
     * per-language file handlers.
     * <p>
     * Change log:<br>
     * cbeust, 2006/08/22
     * <blockquote>
     *   Java annotations (start with "@") are now captured as literals ("lit")
     * </blockquote>
     * @requires console
     * @overrides window
     */
    
    // JSLint declarations
    /*global console, document, navigator, setTimeout, window */
    
    /**
     * Split {@code prettyPrint} into multiple timeouts so as not to interfere with
     * UI events.
     * If set to {@code false}, {@code prettyPrint()} is synchronous.
     */
    window['PR_SHOULD_USE_CONTINUATION'] = true;
    
    /** the number of characters between tab columns */
    window['PR_TAB_WIDTH'] = 8;
    
    /** Walks the DOM returning a properly escaped version of innerHTML.
      * @param {Node} node
      * @param {Array.<string>} out output buffer that receives chunks of HTML.
      */
    window['PR_normalizedHtml']
    
    /** Contains functions for creating and registering new language handlers.
      * @type {Object}
      */
      = window['PR']
    
    /** Pretty print a chunk of code.
      *
      * @param {string} sourceCodeHtml code as html
      * @return {string} code as html, but prettier
      */
      = window['prettyPrintOne']
    /** Find all the {@code <pre>} and {@code <code>} tags in the DOM with
      * {@code class=prettyprint} and prettify them.
      * @param {Function?} opt_whenDone if specified, called when the last entry
      *     has been finished.
      */
      = window['prettyPrint'] = void 0;
    
    /** browser detection. @extern @returns false if not IE, otherwise the major version. */
    window['_pr_isIE6'] = function () {
      var ieVersion = navigator && navigator.userAgent &&
          navigator.userAgent.match(/\bMSIE ([678])\./);
      ieVersion = ieVersion ? +ieVersion[1] : false;
      window['_pr_isIE6'] = function () { return ieVersion; };
      return ieVersion;
    };
    
    
    (function () {
      // Keyword lists for various languages.
      var FLOW_CONTROL_KEYWORDS =
          "break continue do else for if return while ";
      var C_KEYWORDS = FLOW_CONTROL_KEYWORDS + "auto case char const default " +
          "double enum extern float goto int long register short signed sizeof " +
          "static struct switch typedef union unsigned void volatile ";
      var COMMON_KEYWORDS = C_KEYWORDS + "catch class delete false import " +
          "new operator private protected public this throw true try typeof ";
      var CPP_KEYWORDS = COMMON_KEYWORDS + "alignof align_union asm axiom bool " +
          "concept concept_map const_cast constexpr decltype " +
          "dynamic_cast explicit export friend inline late_check " +
          "mutable namespace nullptr reinterpret_cast static_assert static_cast " +
          "template typeid typename using virtual wchar_t where ";
      var JAVA_KEYWORDS = COMMON_KEYWORDS +
          "abstract boolean byte extends final finally implements import " +
          "instanceof null native package strictfp super synchronized throws " +
          "transient ";
      var CSHARP_KEYWORDS = JAVA_KEYWORDS +
          "as base by checked decimal delegate descending event " +
          "fixed foreach from group implicit in interface internal into is lock " +
          "object out override orderby params partial readonly ref sbyte sealed " +
          "stackalloc string select uint ulong unchecked unsafe ushort var ";
      var JSCRIPT_KEYWORDS = COMMON_KEYWORDS +
          "debugger eval export function get null set undefined var with " +
          "Infinity NaN ";
      var PERL_KEYWORDS = "caller delete die do dump elsif eval exit foreach for " +
          "goto if import last local my next no our print package redo require " +
          "sub undef unless until use wantarray while BEGIN END ";
      var PYTHON_KEYWORDS = FLOW_CONTROL_KEYWORDS + "and as assert class def del " +
          "elif except exec finally from global import in is lambda " +
          "nonlocal not or pass print raise try with yield " +
          "False True None ";
      var RUBY_KEYWORDS = FLOW_CONTROL_KEYWORDS + "alias and begin case class def" +
          " defined elsif end ensure false in module next nil not or redo rescue " +
          "retry self super then true undef unless until when yield BEGIN END ";
      var SH_KEYWORDS = FLOW_CONTROL_KEYWORDS + "case done elif esac eval fi " +
          "function in local set then until ";
      var ALL_KEYWORDS = (
          CPP_KEYWORDS + CSHARP_KEYWORDS + JSCRIPT_KEYWORDS + PERL_KEYWORDS +
          PYTHON_KEYWORDS + RUBY_KEYWORDS + SH_KEYWORDS);
    
      // token style names.  correspond to css classes
      /** token style for a string literal */
      var PR_STRING = 'str';
      /** token style for a keyword */
      var PR_KEYWORD = 'kwd';
      /** token style for a comment */
      var PR_COMMENT = 'com';
      /** token style for a type */
      var PR_TYPE = 'typ';
      /** token style for a literal value.  e.g. 1, null, true. */
      var PR_LITERAL = 'lit';
      /** token style for a punctuation string. */
      var PR_PUNCTUATION = 'pun';
      /** token style for a punctuation string. */
      var PR_PLAIN = 'pln';
    
      /** token style for an sgml tag. */
      var PR_TAG = 'tag';
      /** token style for a markup declaration such as a DOCTYPE. */
      var PR_DECLARATION = 'dec';
      /** token style for embedded source. */
      var PR_SOURCE = 'src';
      /** token style for an sgml attribute name. */
      var PR_ATTRIB_NAME = 'atn';
      /** token style for an sgml attribute value. */
      var PR_ATTRIB_VALUE = 'atv';
    
      /**
       * A class that indicates a section of markup that is not code, e.g. to allow
       * embedding of line numbers within code listings.
       */
      var PR_NOCODE = 'nocode';
    
      /** A set of tokens that can precede a regular expression literal in
        * javascript.
        * http://www.mozilla.org/js/language/js20/rationale/syntax.html has the full
        * list, but I've removed ones that might be problematic when seen in
        * languages that don't support regular expression literals.
        *
        * <p>Specifically, I've removed any keywords that can't precede a regexp
        * literal in a syntactically legal javascript program, and I've removed the
        * "in" keyword since it's not a keyword in many languages, and might be used
        * as a count of inches.
        *
        * <p>The link a above does not accurately describe EcmaScript rules since
        * it fails to distinguish between (a=++/b/i) and (a++/b/i) but it works
        * very well in practice.
        *
        * @private
        */
      var REGEXP_PRECEDER_PATTERN = function () {
          var preceders = [
              "!", "!=", "!==", "#", "%", "%=", "&", "&&", "&&=",
              "&=", "(", "*", "*=", /* "+", */ "+=", ",", /* "-", */ "-=",
              "->", /*".", "..", "...", handled below */ "/", "/=", ":", "::", ";",
              "<", "<<", "<<=", "<=", "=", "==", "===", ">",
              ">=", ">>", ">>=", ">>>", ">>>=", "?", "@", "[",
              "^", "^=", "^^", "^^=", "{", "|", "|=", "||",
              "||=", "~" /* handles =~ and !~ */,
              "break", "case", "continue", "delete",
              "do", "else", "finally", "instanceof",
              "return", "throw", "try", "typeof"
              ];
          var pattern = '(?:^^|[+-]';
          for (var i = 0; i < preceders.length; ++i) {
            pattern += '|' + preceders[i].replace(/([^=<>:&a-z])/g, '\\$1');
          }
          pattern += ')\\s*';  // matches at end, and matches empty string
          return pattern;
          // CAVEAT: this does not properly handle the case where a regular
          // expression immediately follows another since a regular expression may
          // have flags for case-sensitivity and the like.  Having regexp tokens
          // adjacent is not valid in any language I'm aware of, so I'm punting.
          // TODO: maybe style special characters inside a regexp as punctuation.
        }();
    
      // Define regexps here so that the interpreter doesn't have to create an
      // object each time the function containing them is called.
      // The language spec requires a new object created even if you don't access
      // the $1 members.
      var pr_amp = /&/g;
      var pr_lt = /</g;
      var pr_gt = />/g;
      var pr_quot = /\"/g;
      /** like textToHtml but escapes double quotes to be attribute safe. */
      function attribToHtml(str) {
        return str.replace(pr_amp, '&amp;')
            .replace(pr_lt, '&lt;')
            .replace(pr_gt, '&gt;')
            .replace(pr_quot, '&quot;');
      }
    
      /** escapest html special characters to html. */
      function textToHtml(str) {
        return str.replace(pr_amp, '&amp;')
            .replace(pr_lt, '&lt;')
            .replace(pr_gt, '&gt;');
      }
    
    
      var pr_ltEnt = /&lt;/g;
      var pr_gtEnt = /&gt;/g;
      var pr_aposEnt = /&apos;/g;
      var pr_quotEnt = /&quot;/g;
      var pr_ampEnt = /&amp;/g;
      var pr_nbspEnt = /&nbsp;/g;
      /** unescapes html to plain text. */
      function htmlToText(html) {
        var pos = html.indexOf('&');
        if (pos < 0) { return html; }
        // Handle numeric entities specially.  We can't use functional substitution
        // since that doesn't work in older versions of Safari.
        // These should be rare since most browsers convert them to normal chars.
        for (--pos; (pos = html.indexOf('&#', pos + 1)) >= 0;) {
          var end = html.indexOf(';', pos);
          if (end >= 0) {
            var num = html.substring(pos + 3, end);
            var radix = 10;
            if (num && num.charAt(0) === 'x') {
              num = num.substring(1);
              radix = 16;
            }
            var codePoint = parseInt(num, radix);
            if (!isNaN(codePoint)) {
              html = (html.substring(0, pos) + String.fromCharCode(codePoint) +
                      html.substring(end + 1));
            }
          }
        }
    
        return html.replace(pr_ltEnt, '<')
            .replace(pr_gtEnt, '>')
            .replace(pr_aposEnt, "'")
            .replace(pr_quotEnt, '"')
            .replace(pr_nbspEnt, ' ')
            .replace(pr_ampEnt, '&');
      }
    
      /** is the given node's innerHTML normally unescaped? */
      function isRawContent(node) {
        return 'XMP' === node.tagName;
      }
    
      var newlineRe = /[\r\n]/g;
      /**
       * Are newlines and adjacent spaces significant in the given node's innerHTML?
       */
      function isPreformatted(node, content) {
        // PRE means preformatted, and is a very common case, so don't create
        // unnecessary computed style objects.
        if ('PRE' === node.tagName) { return true; }
        if (!newlineRe.test(content)) { return true; }  // Don't care
        var whitespace = '';
        // For disconnected nodes, IE has no currentStyle.
        if (node.currentStyle) {
          whitespace = node.currentStyle.whiteSpace;
        } else if (window.getComputedStyle) {
          // Firefox makes a best guess if node is disconnected whereas Safari
          // returns the empty string.
          whitespace = window.getComputedStyle(node, null).whiteSpace;
        }
        return !whitespace || whitespace === 'pre';
      }
    
      function normalizedHtml(node, out) {
        switch (node.nodeType) {
          case 1:  // an element
            var name = node.tagName.toLowerCase();
            out.push('<', name);
            for (var i = 0; i < node.attributes.length; ++i) {
              var attr = node.attributes[i];
              if (!attr.specified) { continue; }
              out.push(' ');
              normalizedHtml(attr, out);
            }
            out.push('>');
            for (var child = node.firstChild; child; child = child.nextSibling) {
              normalizedHtml(child, out);
            }
            if (node.firstChild || !/^(?:br|link|img)$/.test(name)) {
              out.push('<\/', name, '>');
            }
            break;
          case 2: // an attribute
            out.push(node.name.toLowerCase(), '="', attribToHtml(node.value), '"');
            break;
          case 3: case 4: // text
            out.push(textToHtml(node.nodeValue));
            break;
        }
      }
    
      /**
       * Given a group of {@link RegExp}s, returns a {@code RegExp} that globally
       * matches the union o the sets o strings matched d by the input RegExp.
       * Since it matches globally, if the input strings have a start-of-input
       * anchor (/^.../), it is ignored for the purposes of unioning.
       * @param {Array.<RegExp>} regexs non multiline, non-global regexs.
       * @return {RegExp} a global regex.
       */
      function combinePrefixPatterns(regexs) {
        var capturedGroupIndex = 0;
    
        var needToFoldCase = false;
        var ignoreCase = false;
        for (var i = 0, n = regexs.length; i < n; ++i) {
          var regex = regexs[i];
          if (regex.ignoreCase) {
            ignoreCase = true;
          } else if (/[a-z]/i.test(regex.source.replace(
                         /\\u[0-9a-f]{4}|\\x[0-9a-f]{2}|\\[^ux]/gi, ''))) {
            needToFoldCase = true;
            ignoreCase = false;
            break;
          }
        }
    
        function decodeEscape(charsetPart) {
          if (charsetPart.charAt(0) !== '\\') { return charsetPart.charCodeAt(0); }
          switch (charsetPart.charAt(1)) {
            case 'b': return 8;
            case 't': return 9;
            case 'n': return 0xa;
            case 'v': return 0xb;
            case 'f': return 0xc;
            case 'r': return 0xd;
            case 'u': case 'x':
              return parseInt(charsetPart.substring(2), 16)
                  || charsetPart.charCodeAt(1);
            case '0': case '1': case '2': case '3': case '4':
            case '5': case '6': case '7':
              return parseInt(charsetPart.substring(1), 8);
            default: return charsetPart.charCodeAt(1);
          }
        }
    
        function encodeEscape(charCode) {
          if (charCode < 0x20) {
            return (charCode < 0x10 ? '\\x0' : '\\x') + charCode.toString(16);
          }
          var ch = String.fromCharCode(charCode);
          if (ch === '\\' || ch === '-' || ch === '[' || ch === ']') {
            ch = '\\' + ch;
          }
          return ch;
        }
    
        function caseFoldCharset(charSet) {
          var charsetParts = charSet.substring(1, charSet.length - 1).match(
              new RegExp(
                  '\\\\u[0-9A-Fa-f]{4}'
                  + '|\\\\x[0-9A-Fa-f]{2}'
                  + '|\\\\[0-3][0-7]{0,2}'
                  + '|\\\\[0-7]{1,2}'
                  + '|\\\\[\\s\\S]'
                  + '|-'
                  + '|[^-\\\\]',
                  'g'));
          var groups = [];
          var ranges = [];
          var inverse = charsetParts[0] === '^';
          for (var i = inverse ? 1 : 0, n = charsetParts.length; i < n; ++i) {
            var p = charsetParts[i];
            switch (p) {
              case '\\B': case '\\b':
              case '\\D': case '\\d':
              case '\\S': case '\\s':
              case '\\W': case '\\w':
                groups.push(p);
                continue;
            }
            var start = decodeEscape(p);
            var end;
            if (i + 2 < n && '-' === charsetParts[i + 1]) {
              end = decodeEscape(charsetParts[i + 2]);
              i += 2;
            } else {
              end = start;
            }
            ranges.push([start, end]);
            // If the range might intersect letters, then expand it.
            if (!(end < 65 || start > 122)) {
              if (!(end < 65 || start > 90)) {
                ranges.push([Math.max(65, start) | 32, Math.min(end, 90) | 32]);
              }
              if (!(end < 97 || start > 122)) {
                ranges.push([Math.max(97, start) & ~32, Math.min(end, 122) & ~32]);
              }
            }
          }
    
          // [[1, 10], [3, 4], [8, 12], [14, 14], [16, 16], [17, 17]]
          // -> [[1, 12], [14, 14], [16, 17]]
          ranges.sort(function (a, b) { return (a[0] - b[0]) || (b[1]  - a[1]); });
          var consolidatedRanges = [];
          var lastRange = [NaN, NaN];
          for (var i = 0; i < ranges.length; ++i) {
            var range = ranges[i];
            if (range[0] <= lastRange[1] + 1) {
              lastRange[1] = Math.max(lastRange[1], range[1]);
            } else {
              consolidatedRanges.push(lastRange = range);
            }
          }
    
          var out = ['['];
          if (inverse) { out.push('^'); }
          out.push.apply(out, groups);
          for (var i = 0; i < consolidatedRanges.length; ++i) {
            var range = consolidatedRanges[i];
            out.push(encodeEscape(range[0]));
            if (range[1] > range[0]) {
              if (range[1] + 1 > range[0]) { out.push('-'); }
              out.push(encodeEscape(range[1]));
            }
          }
          out.push(']');
          return out.join('');
        }
    
        function allowAnywhereFoldCaseAndRenumberGroups(regex) {
          // Split into character sets, escape sequences, punctuation strings
          // like ('(', '(?:', ')', '^'), and runs of characters that do not
          // include any of the above.
          var parts = regex.source.match(
              new RegExp(
                  '(?:'
                  + '\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]'  // a character set
                  + '|\\\\u[A-Fa-f0-9]{4}'  // a unicode escape
                  + '|\\\\x[A-Fa-f0-9]{2}'  // a hex escape
                  + '|\\\\[0-9]+'  // a back-reference or octal escape
                  + '|\\\\[^ux0-9]'  // other escape sequence
                  + '|\\(\\?[:!=]'  // start of a non-capturing group
                  + '|[\\(\\)\\^]'  // start/emd of a group, or line start
                  + '|[^\\x5B\\x5C\\(\\)\\^]+'  // run of other characters
                  + ')',
                  'g'));
          var n = parts.length;
    
          // Maps captured group numbers to the number they will occupy in
          // the output or to -1 if that has not been determined, or to
          // undefined if they need not be capturing in the output.
          var capturedGroups = [];
    
          // Walk over and identify back references to build the capturedGroups
          // mapping.
          for (var i = 0, groupIndex = 0; i < n; ++i) {
            var p = parts[i];
            if (p === '(') {
              // groups are 1-indexed, so max group index is count of '('
              ++groupIndex;
            } else if ('\\' === p.charAt(0)) {
              var decimalValue = +p.substring(1);
              if (decimalValue && decimalValue <= groupIndex) {
                capturedGroups[decimalValue] = -1;
              }
            }
          }
    
          // Renumber groups and reduce capturing groups to non-capturing groups
          // where possible.
          for (var i = 1; i < capturedGroups.length; ++i) {
            if (-1 === capturedGroups[i]) {
              capturedGroups[i] = ++capturedGroupIndex;
            }
          }
          for (var i = 0, groupIndex = 0; i < n; ++i) {
            var p = parts[i];
            if (p === '(') {
              ++groupIndex;
              if (capturedGroups[groupIndex] === undefined) {
                parts[i] = '(?:';
              }
            } else if ('\\' === p.charAt(0)) {
              var decimalValue = +p.substring(1);
              if (decimalValue && decimalValue <= groupIndex) {
                parts[i] = '\\' + capturedGroups[groupIndex];
              }
            }
          }
    
          // Remove any prefix anchors so that the output will match anywhere.
          // ^^ really does mean an anchored match though.
          for (var i = 0, groupIndex = 0; i < n; ++i) {
            if ('^' === parts[i] && '^' !== parts[i + 1]) { parts[i] = ''; }
          }
    
          // Expand letters to groupts to handle mixing of case-sensitive and
          // case-insensitive patterns if necessary.
          if (regex.ignoreCase && needToFoldCase) {
            for (var i = 0; i < n; ++i) {
              var p = parts[i];
              var ch0 = p.charAt(0);
              if (p.length >= 2 && ch0 === '[') {
                parts[i] = caseFoldCharset(p);
              } else if (ch0 !== '\\') {
                // TODO: handle letters in numeric escapes.
                parts[i] = p.replace(
                    /[a-zA-Z]/g,
                    function (ch) {
                      var cc = ch.charCodeAt(0);
                      return '[' + String.fromCharCode(cc & ~32, cc | 32) + ']';
                    });
              }
            }
          }
    
          return parts.join('');
        }
    
        var rewritten = [];
        for (var i = 0, n = regexs.length; i < n; ++i) {
          var regex = regexs[i];
          if (regex.global || regex.multiline) { throw new Error('' + regex); }
          rewritten.push(
              '(?:' + allowAnywhereFoldCaseAndRenumberGroups(regex) + ')');
        }
    
        return new RegExp(rewritten.join('|'), ignoreCase ? 'gi' : 'g');
      }
    
      var PR_innerHtmlWorks = null;
      function getInnerHtml(node) {
        // inner html is hopelessly broken in Safari 2.0.4 when the content is
        // an html description of well formed XML and the containing tag is a PRE
        // tag, so we detect that case and emulate innerHTML.
        if (null === PR_innerHtmlWorks) {
          var testNode = document.createElement('PRE');
          testNode.appendChild(
              document.createTextNode('<!DOCTYPE foo PUBLIC "foo bar">\n<foo />'));
          PR_innerHtmlWorks = !/</.test(testNode.innerHTML);
        }
    
        if (PR_innerHtmlWorks) {
          var content = node.innerHTML;
          // XMP tags contain unescaped entities so require special handling.
          if (isRawContent(node)) {
            content = textToHtml(content);
          } else if (!isPreformatted(node, content)) {
            content = content.replace(/(<br\s*\/?>)[\r\n]+/g, '$1')
                .replace(/(?:[\r\n]+[ \t]*)+/g, ' ');
          }
          return content;
        }
    
        var out = [];
        for (var child = node.firstChild; child; child = child.nextSibling) {
          normalizedHtml(child, out);
        }
        return out.join('');
      }
    
      /** returns a function that expand tabs to spaces.  This function can be fed
        * successive chunks of text, and will maintain its own internal state to
        * keep track of how tabs are expanded.
        * @return {function (string) : string} a function that takes
        *   plain text and return the text with tabs expanded.
        * @private
        */
      function makeTabExpander(tabWidth) {
        var SPACES = '                ';
        var charInLine = 0;
    
        return function (plainText) {
          // walk over each character looking for tabs and newlines.
          // On tabs, expand them.  On newlines, reset charInLine.
          // Otherwise increment charInLine
          var out = null;
          var pos = 0;
          for (var i = 0, n = plainText.length; i < n; ++i) {
            var ch = plainText.charAt(i);
    
            switch (ch) {
              case '\t':
                if (!out) { out = []; }
                out.push(plainText.substring(pos, i));
                // calculate how much space we need in front of this part
                // nSpaces is the amount of padding -- the number of spaces needed
                // to move us to the next column, where columns occur at factors of
                // tabWidth.
                var nSpaces = tabWidth - (charInLine % tabWidth);
                charInLine += nSpaces;
                for (; nSpaces >= 0; nSpaces -= SPACES.length) {
                  out.push(SPACES.substring(0, nSpaces));
                }
                pos = i + 1;
                break;
              case '\n':
                charInLine = 0;
                break;
              default:
                ++charInLine;
            }
          }
          if (!out) { return plainText; }
          out.push(plainText.substring(pos));
          return out.join('');
        };
      }
    
      var pr_chunkPattern = new RegExp(
          '[^<]+'  // A run of characters other than '<'
          + '|<\!--[\\s\\S]*?--\>'  // an HTML comment
          + '|<!\\[CDATA\\[[\\s\\S]*?\\]\\]>'  // a CDATA section
          // a probable tag that should not be highlighted
          + '|<\/?[a-zA-Z](?:[^>\"\']|\'[^\']*\'|\"[^\"]*\")*>'
          + '|<',  // A '<' that does not begin a larger chunk
          'g');
      var pr_commentPrefix = /^<\!--/;
      var pr_cdataPrefix = /^<!\[CDATA\[/;
      var pr_brPrefix = /^<br\b/i;
      var pr_tagNameRe = /^<(\/?)([a-zA-Z][a-zA-Z0-9]*)/;
    
      /** split markup into chunks of html tags (style null) and
        * plain text (style {@link #PR_PLAIN}), converting tags which are
        * significant for tokenization (<br>) into their textual equivalent.
        *
        * @param {string} s html where whitespace is considered significant.
        * @return {Object} source code and extracted tags.
        * @private
        */
      function extractTags(s) {
        // since the pattern has the 'g' modifier and defines no capturing groups,
        // this will return a list of all chunks which we then classify and wrap as
        // PR_Tokens
        var matches = s.match(pr_chunkPattern);
        var sourceBuf = [];
        var sourceBufLen = 0;
        var extractedTags = [];
        if (matches) {
          for (var i = 0, n = matches.length; i < n; ++i) {
            var match = matches[i];
            if (match.length > 1 && match.charAt(0) === '<') {
              if (pr_commentPrefix.test(match)) { continue; }
              if (pr_cdataPrefix.test(match)) {
                // strip CDATA prefix and suffix.  Don't unescape since it's CDATA
                sourceBuf.push(match.substring(9, match.length - 3));
                sourceBufLen += match.length - 12;
              } else if (pr_brPrefix.test(match)) {
                // <br> tags are lexically significant so convert them to text.
                // This is undone later.
                sourceBuf.push('\n');
                ++sourceBufLen;
              } else {
                if (match.indexOf(PR_NOCODE) >= 0 && isNoCodeTag(match)) {
                  // A <span class="nocode"> will start a section that should be
                  // ignored.  Continue walking the list until we see a matching end
                  // tag.
                  var name = match.match(pr_tagNameRe)[2];
                  var depth = 1;
                  var j;
                  end_tag_loop:
                  for (j = i + 1; j < n; ++j) {
                    var name2 = matches[j].match(pr_tagNameRe);
                    if (name2 && name2[2] === name) {
                      if (name2[1] === '/') {
                        if (--depth === 0) { break end_tag_loop; }
                      } else {
                        ++depth;
                      }
                    }
                  }
                  if (j < n) {
                    extractedTags.push(
                        sourceBufLen, matches.slice(i, j + 1).join(''));
                    i = j;
                  } else {  // Ignore unclosed sections.
                    extractedTags.push(sourceBufLen, match);
                  }
                } else {
                  extractedTags.push(sourceBufLen, match);
                }
              }
            } else {
              var literalText = htmlToText(match);
              sourceBuf.push(literalText);
              sourceBufLen += literalText.length;
            }
          }
        }
        return { source: sourceBuf.join(''), tags: extractedTags };
      }
    
      /** True if the given tag contains a class attribute with the nocode class. */
      function isNoCodeTag(tag) {
        return !!tag
            // First canonicalize the representation of attributes
            .replace(/\s(\w+)\s*=\s*(?:\"([^\"]*)\"|'([^\']*)'|(\S+))/g,
                     ' $1="$2$3$4"')
            // Then look for the attribute we want.
            .match(/[cC][lL][aA][sS][sS]=\"[^\"]*\bnocode\b/);
      }
    
      /**
       * Apply the given language handler to sourceCode and add the resulting
       * decorations to out.
       * @param {number} basePos the index of sourceCode within the chunk of source
       *    whose decorations are already present on out.
       */
      function appendDecorations(basePos, sourceCode, langHandler, out) {
        if (!sourceCode) { return; }
        var job = {
          source: sourceCode,
          basePos: basePos
        };
        langHandler(job);
        out.push.apply(out, job.decorations);
      }
    
      /** Given triples of [style, pattern, context] returns a lexing function,
        * The lexing function interprets the patterns to find token boundaries and
        * returns a decoration list of the form
        * [index_0, style_0, index_1, style_1, ..., index_n, style_n]
        * where index_n is an index into the sourceCode, and style_n is a style
        * constant like PR_PLAIN.  index_n-1 <= index_n, and style_n-1 applies to
        * all characters in sourceCode[index_n-1:index_n].
        *
        * The stylePatterns is a list whose elements have the form
        * [style : string, pattern : RegExp, DEPRECATED, shortcut : string].
        *
        * Style is a style constant like PR_PLAIN, or can be a string of the
        * form 'lang-FOO', where FOO is a language extension describing the
        * language of the portion of the token in $1 after pattern executes.
        * E.g., if style is 'lang-lisp', and group 1 contains the text
        * '(hello (world))', then that portion of the token will be passed to the
        * registered lisp handler for formatting.
        * The text before and after group 1 will be restyled using this decorator
        * so decorators should take care that this doesn't result in infinite
        * recursion.  For example, the HTML lexer rule for SCRIPT elements looks
        * something like ['lang-js', /<[s]cript>(.+?)<\/script>/].  This may match
        * '<script>foo()<\/script>', which would cause the current decorator to
        * be called with '<script>' which would not match the same rule since
        * group 1 must not be empty, so it would be instead styled as PR_TAG by
        * the generic tag rule.  The handler registered for the 'js' extension would
        * then be called with 'foo()', and finally, the current decorator would
        * be called with '<\/script>' which would not match the original rule and
        * so the generic tag rule would identify it as a tag.
        *
        * Pattern must only match prefixes, and if it matches a prefix, then that
        * match is considered a token with the same style.
        *
        * Context is applied to the last non-whitespace, non-comment token
        * recognized.
        *
        * Shortcut is an optional string of characters, any of which, if the first
        * character, gurantee that this pattern and only this pattern matches.
        *
        * @param {Array} shortcutStylePatterns patterns that always start with
        *   a known character.  Must have a shortcut string.
        * @param {Array} fallthroughStylePatterns patterns that will be tried in
        *   order if the shortcut ones fail.  May have shortcuts.
        *
        * @return {function (Object)} a
        *   function that takes source code and returns a list of decorations.
        */
      function createSimpleLexer(shortcutStylePatterns, fallthroughStylePatterns) {
        var shortcuts = {};
        var tokenizer;
        (function () {
          var allPatterns = shortcutStylePatterns.concat(fallthroughStylePatterns);
          var allRegexs = [];
          var regexKeys = {};
          for (var i = 0, n = allPatterns.length; i < n; ++i) {
            var patternParts = allPatterns[i];
            var shortcutChars = patternParts[3];
            if (shortcutChars) {
              for (var c = shortcutChars.length; --c >= 0;) {
                shortcuts[shortcutChars.charAt(c)] = patternParts;
              }
            }
            var regex = patternParts[1];
            var k = '' + regex;
            if (!regexKeys.hasOwnProperty(k)) {
              allRegexs.push(regex);
              regexKeys[k] = null;
            }
          }
          allRegexs.push(/[\0-\uffff]/);
          tokenizer = combinePrefixPatterns(allRegexs);
        })();
    
        var nPatterns = fallthroughStylePatterns.length;
        var notWs = /\S/;
    
        /**
         * Lexes job.source and produces an output array job.decorations of style
         * classes preceded by the position at which they start in job.source in
         * order.
         *
         * @param {Object} job an object like {@code
         *    source: {string} sourceText plain text,
         *    basePos: {int} position of job.source in the larger chunk of
         *        sourceCode.
         * }
         */
        var decorate = function (job) {
          var sourceCode = job.source, basePos = job.basePos;
          /** Even entries are positions in source in ascending order.  Odd enties
            * are style markers (e.g., PR_COMMENT) that run from that position until
            * the end.
            * @type {Array.<number|string>}
            */
          var decorations = [basePos, PR_PLAIN];
          var pos = 0;  // index into sourceCode
          var tokens = sourceCode.match(tokenizer) || [];
          var styleCache = {};
    
          for (var ti = 0, nTokens = tokens.length; ti < nTokens; ++ti) {
            var token = tokens[ti];
            var style = styleCache[token];
            var match = void 0;
    
            var isEmbedded;
            if (typeof style === 'string') {
              isEmbedded = false;
            } else {
              var patternParts = shortcuts[token.charAt(0)];
              if (patternParts) {
                match = token.match(patternParts[1]);
                style = patternParts[0];
              } else {
                for (var i = 0; i < nPatterns; ++i) {
                  patternParts = fallthroughStylePatterns[i];
                  match = token.match(patternParts[1]);
                  if (match) {
                    style = patternParts[0];
                    break;
                  }
                }
    
                if (!match) {  // make sure that we make progress
                  style = PR_PLAIN;
                }
              }
    
              isEmbedded = style.length >= 5 && 'lang-' === style.substring(0, 5);
              if (isEmbedded && !(match && typeof match[1] === 'string')) {
                isEmbedded = false;
                style = PR_SOURCE;
              }
    
              if (!isEmbedded) { styleCache[token] = style; }
            }
    
            var tokenStart = pos;
            pos += token.length;
    
            if (!isEmbedded) {
              decorations.push(basePos + tokenStart, style);
            } else {  // Treat group 1 as an embedded block of source code.
              var embeddedSource = match[1];
              var embeddedSourceStart = token.indexOf(embeddedSource);
              var embeddedSourceEnd = embeddedSourceStart + embeddedSource.length;
              if (match[2]) {
                // If embeddedSource can be blank, then it would match at the
                // beginning which would cause us to infinitely recurse on the
                // entire token, so we catch the right context in match[2].
                embeddedSourceEnd = token.length - match[2].length;
                embeddedSourceStart = embeddedSourceEnd - embeddedSource.length;
              }
              var lang = style.substring(5);
              // Decorate the left of the embedded source
              appendDecorations(
                  basePos + tokenStart,
                  token.substring(0, embeddedSourceStart),
                  decorate, decorations);
              // Decorate the embedded source
              appendDecorations(
                  basePos + tokenStart + embeddedSourceStart,
                  embeddedSource,
                  langHandlerForExtension(lang, embeddedSource),
                  decorations);
              // Decorate the right of the embedded section
              appendDecorations(
                  basePos + tokenStart + embeddedSourceEnd,
                  token.substring(embeddedSourceEnd),
                  decorate, decorations);
            }
          }
          job.decorations = decorations;
        };
        return decorate;
      }
    
      /** returns a function that produces a list of decorations from source text.
        *
        * This code treats ", ', and ` as string delimiters, and \ as a string
        * escape.  It does not recognize perl's qq() style strings.
        * It has no special handling for double delimiter escapes as in basic, or
        * the tripled delimiters used in python, but should work on those regardless
        * although in those cases a single string literal may be broken up into
        * multiple adjacent string literals.
        *
        * It recognizes C, C++, and shell style comments.
        *
        * @param {Object} options a set of optional parameters.
        * @return {function (Object)} a function that examines the source code
        *     in the input job and builds the decoration list.
        */
      function sourceDecorator(options) {
        var shortcutStylePatterns = [], fallthroughStylePatterns = [];
        if (options['tripleQuotedStrings']) {
          // '''multi-line-string''', 'single-line-string', and double-quoted
          shortcutStylePatterns.push(
              [PR_STRING,  /^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/,
               null, '\'"']);
        } else if (options['multiLineStrings']) {
          // 'multi-line-string', "multi-line-string"
          shortcutStylePatterns.push(
              [PR_STRING,  /^(?:\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$)|\`(?:[^\\\`]|\\[\s\S])*(?:\`|$))/,
               null, '\'"`']);
        } else {
          // 'single-line-string', "single-line-string"
          shortcutStylePatterns.push(
              [PR_STRING,
               /^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$)|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/,
               null, '"\'']);
        }
        if (options['verbatimStrings']) {
          // verbatim-string-literal production from the C# grammar.  See issue 93.
          fallthroughStylePatterns.push(
              [PR_STRING, /^@\"(?:[^\"]|\"\")*(?:\"|$)/, null]);
        }
        if (options['hashComments']) {
          if (options['cStyleComments']) {
            // Stop C preprocessor declarations at an unclosed open comment
            shortcutStylePatterns.push(
                [PR_COMMENT, /^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\r\n]*)/,
                 null, '#']);
            fallthroughStylePatterns.push(
                [PR_STRING,
                 /^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,
                 null]);
          } else {
            shortcutStylePatterns.push([PR_COMMENT, /^#[^\r\n]*/, null, '#']);
          }
        }
        if (options['cStyleComments']) {
          fallthroughStylePatterns.push([PR_COMMENT, /^\/\/[^\r\n]*/, null]);
          fallthroughStylePatterns.push(
              [PR_COMMENT, /^\/\*[\s\S]*?(?:\*\/|$)/, null]);
        }
        if (options['regexLiterals']) {
          var REGEX_LITERAL = (
              // A regular expression literal starts with a slash that is
              // not followed by * or / so that it is not confused with
              // comments.
              '/(?=[^/*])'
              // and then contains any number of raw characters,
              + '(?:[^/\\x5B\\x5C]'
              // escape sequences (\x5C),
              +    '|\\x5C[\\s\\S]'
              // or non-nesting character sets (\x5B\x5D);
              +    '|\\x5B(?:[^\\x5C\\x5D]|\\x5C[\\s\\S])*(?:\\x5D|$))+'
              // finally closed by a /.
              + '/');
          fallthroughStylePatterns.push(
              ['lang-regex',
               new RegExp('^' + REGEXP_PRECEDER_PATTERN + '(' + REGEX_LITERAL + ')')
               ]);
        }
    
        var keywords = options['keywords'].replace(/^\s+|\s+$/g, '');
        if (keywords.length) {
          fallthroughStylePatterns.push(
              [PR_KEYWORD,
               new RegExp('^(?:' + keywords.replace(/\s+/g, '|') + ')\\b'), null]);
        }
    
        shortcutStylePatterns.push([PR_PLAIN,       /^\s+/, null, ' \r\n\t\xA0']);
        fallthroughStylePatterns.push(
            // TODO(mikesamuel): recognize non-latin letters and numerals in idents
            [PR_LITERAL,     /^@[a-z_$][a-z_$@0-9]*/i, null],
            [PR_TYPE,        /^@?[A-Z]+[a-z][A-Za-z_$@0-9]*/, null],
            [PR_PLAIN,       /^[a-z_$][a-z_$@0-9]*/i, null],
            [PR_LITERAL,
             new RegExp(
                 '^(?:'
                 // A hex number
                 + '0x[a-f0-9]+'
                 // or an octal or decimal number,
                 + '|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)'
                 // possibly in scientific notation
                 + '(?:e[+\\-]?\\d+)?'
                 + ')'
                 // with an optional modifier like UL for unsigned long
                 + '[a-z]*', 'i'),
             null, '0123456789'],
            [PR_PUNCTUATION, /^.[^\s\w\.$@\'\"\`\/\#]*/, null]);
    
        return createSimpleLexer(shortcutStylePatterns, fallthroughStylePatterns);
      }
    
      var decorateSource = sourceDecorator({
            'keywords': ALL_KEYWORDS,
            'hashComments': true,
            'cStyleComments': true,
            'multiLineStrings': true,
            'regexLiterals': true
          });
    
      /** Breaks {@code job.source} around style boundaries in
        * {@code job.decorations} while re-interleaving {@code job.extractedTags},
        * and leaves the result in {@code job.prettyPrintedHtml}.
        * @param {Object} job like {
        *    source: {string} source as plain text,
        *    extractedTags: {Array.<number|string>} extractedTags chunks of raw
        *                   html preceded by their position in {@code job.source}
        *                   in order
        *    decorations: {Array.<number|string} an array of style classes preceded
        *                 by the position at which they start in job.source in order
        * }
        * @private
        */
      function recombineTagsAndDecorations(job) {
        var sourceText = job.source;
        var extractedTags = job.extractedTags;
        var decorations = job.decorations;
    
        var html = [];
        // index past the last char in sourceText written to html
        var outputIdx = 0;
    
        var openDecoration = null;
        var currentDecoration = null;
        var tagPos = 0;  // index into extractedTags
        var decPos = 0;  // index into decorations
        var tabExpander = makeTabExpander(window['PR_TAB_WIDTH']);
    
        var adjacentSpaceRe = /([\r\n ]) /g;
        var startOrSpaceRe = /(^| ) /gm;
        var newlineRe = /\r\n?|\n/g;
        var trailingSpaceRe = /[ \r\n]$/;
        var lastWasSpace = true;  // the last text chunk emitted ended with a space.
    
        // A helper function that is responsible for opening sections of decoration
        // and outputing properly escaped chunks of source
        function emitTextUpTo(sourceIdx) {
          if (sourceIdx > outputIdx) {
            if (openDecoration && openDecoration !== currentDecoration) {
              // Close the current decoration
              html.push('</span>');
              openDecoration = null;
            }
            if (!openDecoration && currentDecoration) {
              openDecoration = currentDecoration;
              html.push('<span class="', openDecoration, '">');
            }
            // This interacts badly with some wikis which introduces paragraph tags
            // into pre blocks for some strange reason.
            // It's necessary for IE though which seems to lose the preformattedness
            // of <pre> tags when their innerHTML is assigned.
            // http://stud3.tuwien.ac.at/~e0226430/innerHtmlQuirk.html
            // and it serves to undo the conversion of <br>s to newlines done in
            // chunkify.
            var htmlChunk = textToHtml(
                tabExpander(sourceText.substring(outputIdx, sourceIdx)))
                .replace(lastWasSpace
                         ? startOrSpaceRe
                         : adjacentSpaceRe, '$1&nbsp;');
            // Keep track of whether we need to escape space at the beginning of the
            // next chunk.
            lastWasSpace = trailingSpaceRe.test(htmlChunk);
            // IE collapses multiple adjacient <br>s into 1 line break.
            // Prefix every <br> with '&nbsp;' can prevent such IE's behavior.
            var lineBreakHtml = window['_pr_isIE6']() ? '&nbsp;<br />' : '<br />';
            html.push(htmlChunk.replace(newlineRe, lineBreakHtml));
            outputIdx = sourceIdx;
          }
        }
    
        while (true) {
          // Determine if we're going to consume a tag this time around.  Otherwise
          // we consume a decoration or exit.
          var outputTag;
          if (tagPos < extractedTags.length) {
            if (decPos < decorations.length) {
              // Pick one giving preference to extractedTags since we shouldn't open
              // a new style that we're going to have to immediately close in order
              // to output a tag.
              outputTag = extractedTags[tagPos] <= decorations[decPos];
            } else {
              outputTag = true;
            }
          } else {
            outputTag = false;
          }
          // Consume either a decoration or a tag or exit.
          if (outputTag) {
            emitTextUpTo(extractedTags[tagPos]);
            if (openDecoration) {
              // Close the current decoration
              html.push('</span>');
              openDecoration = null;
            }
            html.push(extractedTags[tagPos + 1]);
            tagPos += 2;
          } else if (decPos < decorations.length) {
            emitTextUpTo(decorations[decPos]);
            currentDecoration = decorations[decPos + 1];
            decPos += 2;
          } else {
            break;
          }
        }
        emitTextUpTo(sourceText.length);
        if (openDecoration) {
          html.push('</span>');
        }
        job.prettyPrintedHtml = html.join('');
      }
    
      /** Maps language-specific file extensions to handlers. */
      var langHandlerRegistry = {};
      /** Register a language handler for the given file extensions.
        * @param {function (Object)} handler a function from source code to a list
        *      of decorations.  Takes a single argument job which describes the
        *      state of the computation.   The single parameter has the form
        *      {@code {
        *        source: {string} as plain text.
        *        decorations: {Array.<number|string>} an array of style classes
        *                     preceded by the position at which they start in
        *                     job.source in order.
        *                     The language handler should assigned this field.
        *        basePos: {int} the position of source in the larger source chunk.
        *                 All positions in the output decorations array are relative
        *                 to the larger source chunk.
        *      } }
        * @param {Array.<string>} fileExtensions
        */
      function registerLangHandler(handler, fileExtensions) {
        for (var i = fileExtensions.length; --i >= 0;) {
          var ext = fileExtensions[i];
          if (!langHandlerRegistry.hasOwnProperty(ext)) {
            langHandlerRegistry[ext] = handler;
          } else if ('console' in window) {
            console.warn('cannot override language handler %s', ext);
          }
        }
      }
      function langHandlerForExtension(extension, source) {
        if (!(extension && langHandlerRegistry.hasOwnProperty(extension))) {
          // Treat it as markup if the first non whitespace character is a < and
          // the last non-whitespace character is a >.
          extension = /^\s*</.test(source)
              ? 'default-markup'
              : 'default-code';
        }
        return langHandlerRegistry[extension];
      }
      registerLangHandler(decorateSource, ['default-code']);
      registerLangHandler(
          createSimpleLexer(
              [],
              [
               [PR_PLAIN,       /^[^<?]+/],
               [PR_DECLARATION, /^<!\w[^>]*(?:>|$)/],
               [PR_COMMENT,     /^<\!--[\s\S]*?(?:-\->|$)/],
               // Unescaped content in an unknown language
               ['lang-',        /^<\?([\s\S]+?)(?:\?>|$)/],
               ['lang-',        /^<%([\s\S]+?)(?:%>|$)/],
               [PR_PUNCTUATION, /^(?:<[%?]|[%?]>)/],
               ['lang-',        /^<xmp\b[^>]*>([\s\S]+?)<\/xmp\b[^>]*>/i],
               // Unescaped content in javascript.  (Or possibly vbscript).
               ['lang-js',      /^<script\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],
               // Contains unescaped stylesheet content
               ['lang-css',     /^<style\b[^>]*>([\s\S]*?)(<\/style\b[^>]*>)/i],
               ['lang-in.tag',  /^(<\/?[a-z][^<>]*>)/i]
              ]),
          ['default-markup', 'htm', 'html', 'mxml', 'xhtml', 'xml', 'xsl']);
      registerLangHandler(
          createSimpleLexer(
              [
               [PR_PLAIN,        /^[\s]+/, null, ' \t\r\n'],
               [PR_ATTRIB_VALUE, /^(?:\"[^\"]*\"?|\'[^\']*\'?)/, null, '\"\'']
               ],
              [
               [PR_TAG,          /^^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i],
               [PR_ATTRIB_NAME,  /^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],
               ['lang-uq.val',   /^=\s*([^>\'\"\s]*(?:[^>\'\"\s\/]|\/(?=\s)))/],
               [PR_PUNCTUATION,  /^[=<>\/]+/],
               ['lang-js',       /^on\w+\s*=\s*\"([^\"]+)\"/i],
               ['lang-js',       /^on\w+\s*=\s*\'([^\']+)\'/i],
               ['lang-js',       /^on\w+\s*=\s*([^\"\'>\s]+)/i],
               ['lang-css',      /^style\s*=\s*\"([^\"]+)\"/i],
               ['lang-css',      /^style\s*=\s*\'([^\']+)\'/i],
               ['lang-css',      /^style\s*=\s*([^\"\'>\s]+)/i]
               ]),
          ['in.tag']);
      registerLangHandler(
          createSimpleLexer([], [[PR_ATTRIB_VALUE, /^[\s\S]+/]]), ['uq.val']);
      registerLangHandler(sourceDecorator({
              'keywords': CPP_KEYWORDS,
              'hashComments': true,
              'cStyleComments': true
            }), ['c', 'cc', 'cpp', 'cxx', 'cyc', 'm']);
      registerLangHandler(sourceDecorator({
              'keywords': 'null true false'
            }), ['json']);
      registerLangHandler(sourceDecorator({
              'keywords': CSHARP_KEYWORDS,
              'hashComments': true,
              'cStyleComments': true,
              'verbatimStrings': true
            }), ['cs']);
      registerLangHandler(sourceDecorator({
              'keywords': JAVA_KEYWORDS,
              'cStyleComments': true
            }), ['java']);
      registerLangHandler(sourceDecorator({
              'keywords': SH_KEYWORDS,
              'hashComments': true,
              'multiLineStrings': true
            }), ['bsh', 'csh', 'sh']);
      registerLangHandler(sourceDecorator({
              'keywords': PYTHON_KEYWORDS,
              'hashComments': true,
              'multiLineStrings': true,
              'tripleQuotedStrings': true
            }), ['cv', 'py']);
      registerLangHandler(sourceDecorator({
              'keywords': PERL_KEYWORDS,
              'hashComments': true,
              'multiLineStrings': true,
              'regexLiterals': true
            }), ['perl', 'pl', 'pm']);
      registerLangHandler(sourceDecorator({
              'keywords': RUBY_KEYWORDS,
              'hashComments': true,
              'multiLineStrings': true,
              'regexLiterals': true
            }), ['rb']);
      registerLangHandler(sourceDecorator({
              'keywords': JSCRIPT_KEYWORDS,
              'cStyleComments': true,
              'regexLiterals': true
            }), ['js']);
      registerLangHandler(
          createSimpleLexer([], [[PR_STRING, /^[\s\S]+/]]), ['regex']);
    
      function applyDecorator(job) {
        var sourceCodeHtml = job.sourceCodeHtml;
        var opt_langExtension = job.langExtension;
    
        // Prepopulate output in case processing fails with an exception.
        job.prettyPrintedHtml = sourceCodeHtml;
    
        try {
          // Extract tags, and convert the source code to plain text.
          var sourceAndExtractedTags = extractTags(sourceCodeHtml);
          /** Plain text. @type {string} */
          var source = sourceAndExtractedTags.source;
          job.source = source;
          job.basePos = 0;
    
          /** Even entries are positions in source in ascending order.  Odd entries
            * are tags that were extracted at that position.
            * @type {Array.<number|string>}
            */
          job.extractedTags = sourceAndExtractedTags.tags;
    
          // Apply the appropriate language handler
          langHandlerForExtension(opt_langExtension, source)(job);
          // Integrate the decorations and tags back into the source code to produce
          // a decorated html string which is left in job.prettyPrintedHtml.
          recombineTagsAndDecorations(job);
        } catch (e) {
          if ('console' in window) {
            console.log(e);
            console.trace();
          }
        }
      }
    
      function prettyPrintOne(sourceCodeHtml, opt_langExtension) {
        var job = {
          sourceCodeHtml: sourceCodeHtml,
          langExtension: opt_langExtension
        };
        applyDecorator(job);
        return job.prettyPrintedHtml;
      }
    
      function prettyPrint(opt_whenDone) {
        var isIE678 = window['_pr_isIE6']();
        var ieNewline = isIE678 === 6 ? '\r\n' : '\r';
        // See bug 71 and http://stackoverflow.com/questions/136443/why-doesnt-ie7-
    
        // fetch a list of nodes to rewrite
        var codeSegments = [
            document.getElementsByTagName('pre'),
            document.getElementsByTagName('code'),
            document.getElementsByTagName('xmp') ];
        var elements = [];
        for (var i = 0; i < codeSegments.length; ++i) {
          for (var j = 0, n = codeSegments[i].length; j < n; ++j) {
            elements.push(codeSegments[i][j]);
          }
        }
        codeSegments = null;
    
        var clock = Date;
        if (!clock['now']) {
          clock = { 'now': function () { return (new Date).getTime(); } };
        }
    
        // The loop is broken into a series of continuations to make sure that we
        // don't make the browser unresponsive when rewriting a large page.
        var k = 0;
        var prettyPrintingJob;
    
        function doWork() {
          var endTime = (window['PR_SHOULD_USE_CONTINUATION'] ?
                         clock.now() + 250 /* ms */ :
                         Infinity);
          for (; k < elements.length && clock.now() < endTime; k++) {
            var cs = elements[k];
            if (cs.className && cs.className.indexOf('prettyprint') >= 0) {
              // If the classes includes a language extensions, use it.
              // Language extensions can be specified like
              //     <pre class="prettyprint lang-cpp">
              // the language extension "cpp" is used to find a language handler as
              // passed to PR_registerLangHandler.
              var langExtension = cs.className.match(/\blang-(\w+)\b/);
              if (langExtension) { langExtension = langExtension[1]; }
    
              // make sure this is not nested in an already prettified element
              var nested = false;
              for (var p = cs.parentNode; p; p = p.parentNode) {
                if ((p.tagName === 'pre' || p.tagName === 'code' ||
                     p.tagName === 'xmp') &&
                    p.className && p.className.indexOf('prettyprint') >= 0) {
                  nested = true;
                  break;
                }
              }
              if (!nested) {
                // fetch the content as a snippet of properly escaped HTML.
                // Firefox adds newlines at the end.
                var content = getInnerHtml(cs);
                content = content.replace(/(?:\r\n?|\n)$/, '');
    
                // do the pretty printing
                prettyPrintingJob = {
                  sourceCodeHtml: content,
                  langExtension: langExtension,
                  sourceNode: cs
                };
                applyDecorator(prettyPrintingJob);
                replaceWithPrettyPrintedHtml();
              }
            }
          }
          if (k < elements.length) {
            // finish up in a continuation
            setTimeout(doWork, 250);
          } else if (opt_whenDone) {
            opt_whenDone();
          }
        }
    
        function replaceWithPrettyPrintedHtml() {
          var newContent = prettyPrintingJob.prettyPrintedHtml;
          if (!newContent) { return; }
          var cs = prettyPrintingJob.sourceNode;
    
          // push the prettified html back into the tag.
          if (!isRawContent(cs)) {
            // just replace the old html with the new
            cs.innerHTML = newContent;
          } else {
            // we need to change the tag to a <pre> since <xmp>s do not allow
            // embedded tags such as the span tags used to attach styles to
            // sections of source code.
            var pre = document.createElement('PRE');
            for (var i = 0; i < cs.attributes.length; ++i) {
              var a = cs.attributes[i];
              if (a.specified) {
                var aname = a.name.toLowerCase();
                if (aname === 'class') {
                  pre.className = a.value;  // For IE 6
                } else {
                  pre.setAttribute(a.name, a.value);
                }
              }
            }
            pre.innerHTML = newContent;
    
            // remove the old
            cs.parentNode.replaceChild(pre, cs);
            cs = pre;
          }
    
          // Replace <br>s with line-feeds so that copying and pasting works
          // on IE 6.
          // Doing this on other browsers breaks lots of stuff since \r\n is
          // treated as two newlines on Firefox, and doing this also slows
          // down rendering.
          if (isIE678 && cs.tagName === 'PRE') {
            var lineBreaks = cs.getElementsByTagName('br');
            for (var j = lineBreaks.length; --j >= 0;) {
              var lineBreak = lineBreaks[j];
              lineBreak.parentNode.replaceChild(
                  document.createTextNode(ieNewline), lineBreak);
            }
          }
        }
    
        doWork();
      }
    
      window['PR_normalizedHtml'] = normalizedHtml;
      window['prettyPrintOne'] = prettyPrintOne;
      window['prettyPrint'] = prettyPrint;
      window['PR'] = {
            'combinePrefixPatterns': combinePrefixPatterns,
            'createSimpleLexer': createSimpleLexer,
            'registerLangHandler': registerLangHandler,
            'sourceDecorator': sourceDecorator,
            'PR_ATTRIB_NAME': PR_ATTRIB_NAME,
            'PR_ATTRIB_VALUE': PR_ATTRIB_VALUE,
            'PR_COMMENT': PR_COMMENT,
            'PR_DECLARATION': PR_DECLARATION,
            'PR_KEYWORD': PR_KEYWORD,
            'PR_LITERAL': PR_LITERAL,
            'PR_NOCODE': PR_NOCODE,
            'PR_PLAIN': PR_PLAIN,
            'PR_PUNCTUATION': PR_PUNCTUATION,
            'PR_SOURCE': PR_SOURCE,
            'PR_STRING': PR_STRING,
            'PR_TAG': PR_TAG,
            'PR_TYPE': PR_TYPE
          };
    })();
    
    ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������rickshaw-1.4.6/vendor/������������������������������������������������������������������������������0000775�0000000�0000000�00000000000�12251233401�0014623�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������rickshaw-1.4.6/vendor/d3.layout.min.js��������������������������������������������������������������0000664�0000000�0000000�00000042152�12251233401�0017571�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������(function(){function a(a){var b=a.source,d=a.target,e=c(b,d),f=[b];while(b!==e)b=b.parent,f.push(b);var g=f.length;while(d!==e)f.splice(g,0,d),d=d.parent;return f}function b(a){var b=[],c=a.parent;while(c!=null)b.push(a),a=c,c=c.parent;return b.push(a),b}function c(a,c){if(a===c)return a;var d=b(a),e=b(c),f=d.pop(),g=e.pop(),h=null;while(f===g)h=f,f=d.pop(),g=e.pop();return h}function g(a){a.fixed|=2}function h(a){a!==f&&(a.fixed&=1)}function i(){j(),f.fixed&=1,e=f=null}function j(){f.px+=d3.event.dx,f.py+=d3.event.dy,e.resume()}function k(a,b,c){var d=0,e=0;a.charge=0;if(!a.leaf){var f=a.nodes,g=f.length,h=-1,i;while(++h<g){i=f[h];if(i==null)continue;k(i,b,c),a.charge+=i.charge,d+=i.charge*i.cx,e+=i.charge*i.cy}}if(a.point){a.leaf||(a.point.x+=Math.random()-.5,a.point.y+=Math.random()-.5);var j=b*c[a.point.index];a.charge+=a.pointCharge=j,d+=j*a.point.x,e+=j*a.point.y}a.cx=d/a.charge,a.cy=e/a.charge}function l(a){return 20}function m(a){return 1}function o(a){return a.x}function p(a){return a.y}function q(a,b,c){a.y0=b,a.y=c}function t(a){var b=1,c=0,d=a[0][1],e,f=a.length;for(;b<f;++b)(e=a[b][1])>d&&(c=b,d=e);return c}function u(a){return a.reduce(v,0)}function v(a,b){return a+b[1]}function w(a,b){return x(a,Math.ceil(Math.log(b.length)/Math.LN2+1))}function x(a,b){var c=-1,d=+a[0],e=(a[1]-d)/b,f=[];while(++c<=b)f[c]=e*c+d;return f}function y(a){return[d3.min(a),d3.max(a)]}function z(a,b){return a.sort=d3.rebind(a,b.sort),a.children=d3.rebind(a,b.children),a.links=D,a.value=d3.rebind(a,b.value),a.nodes=function(b){return E=!0,(a.nodes=a)(b)},a}function A(a){return a.children}function B(a){return a.value}function C(a,b){return b.value-a.value}function D(a){return d3.merge(a.map(function(a){return(a.children||[]).map(function(b){return{source:a,target:b}})}))}function F(a,b){return a.value-b.value}function G(a,b){var c=a._pack_next;a._pack_next=b,b._pack_prev=a,b._pack_next=c,c._pack_prev=b}function H(a,b){a._pack_next=b,b._pack_prev=a}function I(a,b){var c=b.x-a.x,d=b.y-a.y,e=a.r+b.r;return e*e-c*c-d*d>.001}function J(a){function l(a){b=Math.min(a.x-a.r,b),c=Math.max(a.x+a.r,c),d=Math.min(a.y-a.r,d),e=Math.max(a.y+a.r,e)}var b=Infinity,c=-Infinity,d=Infinity,e=-Infinity,f=a.length,g,h,i,j,k;a.forEach(K),g=a[0],g.x=-g.r,g.y=0,l(g);if(f>1){h=a[1],h.x=h.r,h.y=0,l(h);if(f>2){i=a[2],O(g,h,i),l(i),G(g,i),g._pack_prev=i,G(i,h),h=g._pack_next;for(var m=3;m<f;m++){O(g,h,i=a[m]);var n=0,o=1,p=1;for(j=h._pack_next;j!==h;j=j._pack_next,o++)if(I(j,i)){n=1;break}if(n==1)for(k=g._pack_prev;k!==j._pack_prev;k=k._pack_prev,p++)if(I(k,i)){p<o&&(n=-1,j=k);break}n==0?(G(g,i),h=i,l(i)):n>0?(H(g,j),h=j,m--):(H(j,h),g=j,m--)}}}var q=(b+c)/2,r=(d+e)/2,s=0;for(var m=0;m<f;m++){var t=a[m];t.x-=q,t.y-=r,s=Math.max(s,t.r+Math.sqrt(t.x*t.x+t.y*t.y))}return a.forEach(L),s}function K(a){a._pack_next=a._pack_prev=a}function L(a){delete a._pack_next,delete a._pack_prev}function M(a){var b=a.children;b&&b.length?(b.forEach(M),a.r=J(b)):a.r=Math.sqrt(a.value)}function N(a,b,c,d){var e=a.children;a.x=b+=d*a.x,a.y=c+=d*a.y,a.r*=d;if(e){var f=-1,g=e.length;while(++f<g)N(e[f],b,c,d)}}function O(a,b,c){var d=a.r+c.r,e=b.x-a.x,f=b.y-a.y;if(d&&(e||f)){var g=b.r+c.r,h=Math.sqrt(e*e+f*f),i=Math.max(-1,Math.min(1,(d*d+h*h-g*g)/(2*d*h))),j=Math.acos(i),k=i*(d/=h),l=Math.sin(j)*d;c.x=a.x+k*e+l*f,c.y=a.y+k*f-l*e}else c.x=a.x+d,c.y=a.y}function P(a){return 1+d3.max(a,function(a){return a.y})}function Q(a){return a.reduce(function(a,b){return a+b.x},0)/a.length}function R(a){var b=a.children;return b&&b.length?R(b[0]):a}function S(a){var b=a.children,c;return b&&(c=b.length)?S(b[c-1]):a}function T(a,b){return a.parent==b.parent?1:2}function U(a){var b=a.children;return b&&b.length?b[0]:a._tree.thread}function V(a){var b=a.children,c;return b&&(c=b.length)?b[c-1]:a._tree.thread}function W(a,b){var c=a.children;if(c&&(e=c.length)){var d,e,f=-1;while(++f<e)b(d=W(c[f],b),a)>0&&(a=d)}return a}function X(a,b){return a.x-b.x}function Y(a,b){return b.x-a.x}function Z(a,b){return a.depth-b.depth}function $(a,b){function c(a,d){var e=a.children;if(e&&(i=e.length)){var f,g=null,h=-1,i;while(++h<i)f=e[h],c(f,g),g=f}b(a,d)}c(a,null)}function _(a){var b=0,c=0,d=a.children,e=d.length,f;while(--e>=0)f=d[e]._tree,f.prelim+=b,f.mod+=b,b+=f.shift+(c+=f.change)}function ba(a,b,c){a=a._tree,b=b._tree;var d=c/(b.number-a.number);a.change+=d,b.change-=d,b.shift+=c,b.prelim+=c,b.mod+=c}function bb(a,b,c){return a._tree.ancestor.parent==b.parent?a._tree.ancestor:c}function bc(a){return{x:a.x,y:a.y,dx:a.dx,dy:a.dy}}function bd(a,b){var c=a.x+b[3],d=a.y+b[0],e=a.dx-b[1]-b[3],f=a.dy-b[0]-b[2];return e<0&&(c+=e/2,e=0),f<0&&(d+=f/2,f=0),{x:c,y:d,dx:e,dy:f}}d3.layout={},d3.layout.bundle=function(){return function(b){var c=[],d=-1,e=b.length;while(++d<e)c.push(a(b[d]));return c}},d3.layout.chord=function(){function j(){var a={},j=[],l=d3.range(e),m=[],n,o,p,q,r;b=[],c=[],n=0,q=-1;while(++q<e){o=0,r=-1;while(++r<e)o+=d[q][r];j.push(o),m.push(d3.range(e)),n+=o}g&&l.sort(function(a,b){return g(j[a],j[b])}),h&&m.forEach(function(a,b){a.sort(function(a,c){return h(d[b][a],d[b][c])})}),n=(2*Math.PI-f*e)/n,o=0,q=-1;while(++q<e){p=o,r=-1;while(++r<e){var s=l[q],t=m[s][r],u=d[s][t],v=o,w=o+=u*n;a[s+"-"+t]={index:s,subindex:t,startAngle:v,endAngle:w,value:u}}c.push({index:s,startAngle:p,endAngle:o,value:(o-p)/n}),o+=f}q=-1;while(++q<e){r=q-1;while(++r<e){var x=a[q+"-"+r],y=a[r+"-"+q];(x.value||y.value)&&b.push(x.value<y.value?{source:y,target:x}:{source:x,target:y})}}i&&k()}function k(){b.sort(function(a,b){return i((a.source.value+a.target.value)/2,(b.source.value+b.target.value)/2)})}var a={},b,c,d,e,f=0,g,h,i;return a.matrix=function(f){return arguments.length?(e=(d=f)&&d.length,b=c=null,a):d},a.padding=function(d){return arguments.length?(f=d,b=c=null,a):f},a.sortGroups=function(d){return arguments.length?(g=d,b=c=null,a):g},a.sortSubgroups=function(c){return arguments.length?(h=c,b=null,a):h},a.sortChords=function(c){return arguments.length?(i=c,b&&k(),a):i},a.chords=function(){return b||j(),b},a.groups=function(){return c||j(),c},a},d3.layout.force=function(){function A(a){return function(b,c,d,e,f){if(b.point!==a){var g=b.cx-a.x,h=b.cy-a.y,i=1/Math.sqrt(g*g+h*h);if((e-c)*i<t){var j=b.charge*i*i;return a.px-=g*j,a.py-=h*j,!0}if(b.point&&isFinite(i)){var j=b.pointCharge*i*i;a.px-=g*j,a.py-=h*j}}return!b.charge}}function B(){var a=v.length,d=w.length,e,f,g,h,i,j,l,m,p;for(f=0;f<d;++f){g=w[f],h=g.source,i=g.target,m=i.x-h.x,p=i.y-h.y;if(j=m*m+p*p)j=n*y[f]*((j=Math.sqrt(j))-x[f])/j,m*=j,p*=j,i.x-=m*(l=h.weight/(i.weight+h.weight)),i.y-=p*l,h.x+=m*(l=1-l),h.y+=p*l}if(l=n*s){m=c[0]/2,p=c[1]/2,f=-1;if(l)while(++f<a)g=v[f],g.x+=(m-g.x)*l,g.y+=(p-g.y)*l}if(r){k(e=d3.geom.quadtree(v),n,z),f=-1;while(++f<a)(g=v[f]).fixed||e.visit(A(g))}f=-1;while(++f<a)g=v[f],g.fixed?(g.x=g.px,g.y=g.py):(g.x-=(g.px-(g.px=g.x))*o,g.y-=(g.py-(g.py=g.y))*o);return b.tick({type:"tick",alpha:n}),(n*=.99)<.005}function C(b){g(f=b),e=a}var a={},b=d3.dispatch("tick"),c=[1,1],d,n,o=.9,p=l,q=m,r=-30,s=.1,t=.8,u,v=[],w=[],x,y,z;return a.on=function(c,d){return b.on(c,d),a},a.nodes=function(b){return arguments.length?(v=b,a):v},a.links=function(b){return arguments.length?(w=b,a):w},a.size=function(b){return arguments.length?(c=b,a):c},a.linkDistance=function(b){return arguments.length?(p=d3.functor(b),a):p},a.distance=a.linkDistance,a.linkStrength=function(b){return arguments.length?(q=d3.functor(b),a):q},a.friction=function(b){return arguments.length?(o=b,a):o},a.charge=function(b){return arguments.length?(r=typeof b=="function"?b:+b,a):r},a.gravity=function(b){return arguments.length?(s=b,a):s},a.theta=function(b){return arguments.length?(t=b,a):t},a.start=function(){function k(a,c){var d=l(b),e=-1,f=d.length,g;while(++e<f)if(!isNaN(g=d[e][a]))return g;return Math.random()*c}function l(){if(!i){i=[];for(d=0;d<e;++d)i[d]=[];for(d=0;d<f;++d){var a=w[d];i[a.source.index].push(a.target),i[a.target.index].push(a.source)}}return i[b]}var b,d,e=v.length,f=w.length,g=c[0],h=c[1],i,j;for(b=0;b<e;++b)(j=v[b]).index=b,j.weight=0;x=[],y=[];for(b=0;b<f;++b)j=w[b],typeof j.source=="number"&&(j.source=v[j.source]),typeof j.target=="number"&&(j.target=v[j.target]),x[b]=p.call(this,j,b),y[b]=q.call(this,j,b),++j.source.weight,++j.target.weight;for(b=0;b<e;++b)j=v[b],isNaN(j.x)&&(j.x=k("x",g)),isNaN(j.y)&&(j.y=k("y",h)),isNaN(j.px)&&(j.px=j.x),isNaN(j.py)&&(j.py=j.y);z=[];if(typeof r=="function")for(b=0;b<e;++b)z[b]=+r.call(this,v[b],b);else for(b=0;b<e;++b)z[b]=r;return a.resume()},a.resume=function(){return n=.1,d3.timer(B),a},a.stop=function(){return n=0,a},a.drag=function(){d||(d=d3.behavior.drag().on("dragstart",C).on("drag",j).on("dragend",i)),this.on("mouseover.force",g).on("mouseout.force",h).call(d)},a};var e,f;d3.layout.partition=function(){function c(a,b,d,e){var f=a.children;a.x=b,a.y=a.depth*e,a.dx=d,a.dy=e;if(f&&(h=f.length)){var g=-1,h,i,j;d=a.value?d/a.value:0;while(++g<h)c(i=f[g],b,j=i.value*d,e),b+=j}}function d(a){var b=a.children,c=0;if(b&&(f=b.length)){var e=-1,f;while(++e<f)c=Math.max(c,d(b[e]))}return 1+c}function e(e,f){var g=a.call(this,e,f);return c(g[0],0,b[0],b[1]/d(g[0])),g}var a=d3.layout.hierarchy(),b=[1,1];return e.size=function(a){return arguments.length?(b=a,e):b},z(e,a)},d3.layout.pie=function(){function f(g,h){var i=g.map(function(b,c){return+a.call(f,b,c)}),j=+(typeof c=="function"?c.apply(this,arguments):c),k=((typeof e=="function"?e.apply(this,arguments):e)-c)/d3.sum(i),l=d3.range(g.length);b!=null&&l.sort(b===n?function(a,b){return i[b]-i[a]}:function(a,c){return b(g[a],g[c])});var m=l.map(function(a){return{data:g[a],value:d=i[a],startAngle:j,endAngle:j+=d*k}});return g.map(function(a,b){return m[l[b]]})}var a=Number,b=n,c=0,e=2*Math.PI;return f.value=function(b){return arguments.length?(a=b,f):a},f.sort=function(a){return arguments.length?(b=a,f):b},f.startAngle=function(a){return arguments.length?(c=a,f):c},f.endAngle=function(a){return arguments.length?(e=a,f):e},f};var n={};d3.layout.stack=function(){function g(h,i){var j=h.map(function(b,c){return a.call(g,b,c)}),k=j.map(function(a,b){return a.map(function(a,b){return[e.call(g,a,b),f.call(g,a,b)]})}),l=b.call(g,k,i);j=d3.permute(j,l),k=d3.permute(k,l);var m=c.call(g,k,i),n=j.length,o=j[0].length,p,q,r;for(q=0;q<o;++q){d.call(g,j[0][q],r=m[q],k[0][q][1]);for(p=1;p<n;++p)d.call(g,j[p][q],r+=k[p-1][q][1],k[p][q][1])}return h}var a=Object,b=r["default"],c=s.zero,d=q,e=o,f=p;return g.values=function(b){return arguments.length?(a=b,g):a},g.order=function(a){return arguments.length?(b=typeof a=="function"?a:r[a],g):b},g.offset=function(a){return arguments.length?(c=typeof a=="function"?a:s[a],g):c},g.x=function(a){return arguments.length?(e=a,g):e},g.y=function(a){return arguments.length?(f=a,g):f},g.out=function(a){return arguments.length?(d=a,g):d},g};var r={"inside-out":function(a){var b=a.length,c,d,e=a.map(t),f=a.map(u),g=d3.range(b).sort(function(a,b){return e[a]-e[b]}),h=0,i=0,j=[],k=[];for(c=0;c<b;++c)d=g[c],h<i?(h+=f[d],j.push(d)):(i+=f[d],k.push(d));return k.reverse().concat(j)},reverse:function(a){return d3.range(a.length).reverse()},"default":function(a){return d3.range(a.length)}},s={silhouette:function(a){var b=a.length,c=a[0].length,d=[],e=0,f,g,h,i=[];for(g=0;g<c;++g){for(f=0,h=0;f<b;f++)h+=a[f][g][1];h>e&&(e=h),d.push(h)}for(g=0;g<c;++g)i[g]=(e-d[g])/2;return i},wiggle:function(a){var b=a.length,c=a[0],d=c.length,e=0,f,g,h,i,j,k,l,m,n,o=[];o[0]=m=n=0;for(g=1;g<d;++g){for(f=0,i=0;f<b;++f)i+=a[f][g][1];for(f=0,j=0,l=c[g][0]-c[g-1][0];f<b;++f){for(h=0,k=(a[f][g][1]-a[f][g-1][1])/(2*l);h<f;++h)k+=(a[h][g][1]-a[h][g-1][1])/l;j+=k*a[f][g][1]}o[g]=m-=i?j/i*l:0,m<n&&(n=m)}for(g=0;g<d;++g)o[g]-=n;return o},expand:function(a){var b=a.length,c=a[0].length,d=1/b,e,f,g,h=[];for(f=0;f<c;++f){for(e=0,g=0;e<b;e++)g+=a[e][f][1];if(g)for(e=0;e<b;e++)a[e][f][1]/=g;else for(e=0;e<b;e++)a[e][f][1]=d}for(f=0;f<c;++f)h[f]=0;return h},zero:function(a){var b=-1,c=a[0].length,d=[];while(++b<c)d[b]=0;return d}};d3.layout.histogram=function(){function e(e,f){var g=[],h=e.map(b,this),i=c.call(this,h,f),j=d.call(this,i,h,f),k,f=-1,l=h.length,m=j.length-1,n=a?1:1/l,o;while(++f<m)k=g[f]=[],k.dx=j[f+1]-(k.x=j[f]),k.y=0;f=-1;while(++f<l)o=h[f],o>=i[0]&&o<=i[1]&&(k=g[d3.bisect(j,o,1,m)-1],k.y+=n,k.push(e[f]));return g}var a=!0,b=Number,c=y,d=w;return e.value=function(a){return arguments.length?(b=a,e):b},e.range=function(a){return arguments.length?(c=d3.functor(a),e):c},e.bins=function(a){return arguments.length?(d=typeof a=="number"?function(b){return x(b,a)}:d3.functor(a),e):d},e.frequency=function(b){return arguments.length?(a=!!b,e):a},e},d3.layout.hierarchy=function(){function e(f,h,i){var j=b.call(g,f,h),k=E?f:{data:f};k.depth=h,i.push(k);if(j&&(m=j.length)){var l=-1,m,n=k.children=[],o=0,p=h+1;while(++l<m)d=e(j[l],p,i),d.parent=k,n.push(d),o+=d.value;a&&n.sort(a),c&&(k.value=o)}else c&&(k.value=+c.call(g,f,h)||0);return k}function f(a,b){var d=a.children,e=0;if(d&&(i=d.length)){var h=-1,i,j=b+1;while(++h<i)e+=f(d[h],j)}else c&&(e=+c.call(g,E?a:a.data,b)||0);return c&&(a.value=e),e}function g(a){var b=[];return e(a,0,b),b}var a=C,b=A,c=B;return g.sort=function(b){return arguments.length?(a=b,g):a},g.children=function(a){return arguments.length?(b=a,g):b},g.value=function(a){return arguments.length?(c=a,g):c},g.revalue=function(a){return f(a,0),a},g};var E=!1;d3.layout.pack=function(){function c(c,d){var e=a.call(this,c,d),f=e[0];f.x=0,f.y=0,M(f);var g=b[0],h=b[1],i=1/Math.max(2*f.r/g,2*f.r/h);return N(f,g/2,h/2,i),e}var a=d3.layout.hierarchy().sort(F),b=[1,1];return c.size=function(a){return arguments.length?(b=a,c):b},z(c,a)},d3.layout.cluster=function(){function d(d,e){var f=a.call(this,d,e),g=f[0],h,i=0,j,k;$(g,function(a){var c=a.children;c&&c.length?(a.x=Q(c),a.y=P(c)):(a.x=h?i+=b(a,h):0,a.y=0,h=a)});var l=R(g),m=S(g),n=l.x-b(l,m)/2,o=m.x+b(m,l)/2;return $(g,function(a){a.x=(a.x-n)/(o-n)*c[0],a.y=(1-a.y/g.y)*c[1]}),f}var a=d3.layout.hierarchy().sort(null).value(null),b=T,c=[1,1];return d.separation=function(a){return arguments.length?(b=a,d):b},d.size=function(a){return arguments.length?(c=a,d):c},z(d,a)},d3.layout.tree=function(){function d(d,e){function h(a,c){var d=a.children,e=a._tree;if(d&&(f=d.length)){var f,g=d[0],i,k=g,l,m=-1;while(++m<f)l=d[m],h(l,i),k=j(l,i,k),i=l;_(a);var n=.5*(g._tree.prelim+l._tree.prelim);c?(e.prelim=c._tree.prelim+b(a,c),e.mod=e.prelim-n):e.prelim=n}else c&&(e.prelim=c._tree.prelim+b(a,c))}function i(a,b){a.x=a._tree.prelim+b;var c=a.children;if(c&&(e=c.length)){var d=-1,e;b+=a._tree.mod;while(++d<e)i(c[d],b)}}function j(a,c,d){if(c){var e=a,f=a,g=c,h=a.parent.children[0],i=e._tree.mod,j=f._tree.mod,k=g._tree.mod,l=h._tree.mod,m;while(g=V(g),e=U(e),g&&e)h=U(h),f=V(f),f._tree.ancestor=a,m=g._tree.prelim+k-e._tree.prelim-i+b(g,e),m>0&&(ba(bb(g,a,d),a,m),i+=m,j+=m),k+=g._tree.mod,i+=e._tree.mod,l+=h._tree.mod,j+=f._tree.mod;g&&!V(f)&&(f._tree.thread=g,f._tree.mod+=k-j),e&&!U(h)&&(h._tree.thread=e,h._tree.mod+=i-l,d=a)}return d}var f=a.call(this,d,e),g=f[0];$(g,function(a,b){a._tree={ancestor:a,prelim:0,mod:0,change:0,shift:0,number:b?b._tree.number+1:0}}),h(g),i(g,-g._tree.prelim);var k=W(g,Y),l=W(g,X),m=W(g,Z),n=k.x-b(k,l)/2,o=l.x+b(l,k)/2,p=m.depth||1;return $(g,function(a){a.x=(a.x-n)/(o-n)*c[0],a.y=a.depth/p*c[1],delete a._tree}),f}var a=d3.layout.hierarchy().sort(null).value(null),b=T,c=[1,1];return d.separation=function(a){return arguments.length?(b=a,d):b},d.size=function(a){return arguments.length?(c=a,d):c},z(d,a)},d3.layout.treemap=function(){function i(a,b){var c=-1,d=a.length,e,f;while(++c<d)f=(e=a[c]).value*(b<0?0:b),e.area=isNaN(f)||f<=0?0:f}function j(a){var b=a.children;if(b&&b.length){var c=e(a),d=[],f=b.slice(),g,h=Infinity,k,n=Math.min(c.dx,c.dy),o;i(f,c.dx*c.dy/a.value),d.area=0;while((o=f.length)>0)d.push(g=f[o-1]),d.area+=g.area,(k=l(d,n))<=h?(f.pop(),h=k):(d.area-=d.pop().area,m(d,n,c,!1),n=Math.min(c.dx,c.dy),d.length=d.area=0,h=Infinity);d.length&&(m(d,n,c,!0),d.length=d.area=0),b.forEach(j)}}function k(a){var b=a.children;if(b&&b.length){var c=e(a),d=b.slice(),f,g=[];i(d,c.dx*c.dy/a.value),g.area=0;while(f=d.pop())g.push(f),g.area+=f.area,f.z!=null&&(m(g,f.z?c.dx:c.dy,c,!d.length),g.length=g.area=0);b.forEach(k)}}function l(a,b){var c=a.area,d,e=0,f=Infinity,g=-1,i=a.length;while(++g<i){if(!(d=a[g].area))continue;d<f&&(f=d),d>e&&(e=d)}return c*=c,b*=b,c?Math.max(b*e*h/c,c/(b*f*h)):Infinity}function m(a,c,d,e){var f=-1,g=a.length,h=d.x,i=d.y,j=c?b(a.area/c):0,k;if(c==d.dx){if(e||j>d.dy)j=j?d.dy:0;while(++f<g)k=a[f],k.x=h,k.y=i,k.dy=j,h+=k.dx=j?b(k.area/j):0;k.z=!0,k.dx+=d.x+d.dx-h,d.y+=j,d.dy-=j}else{if(e||j>d.dx)j=j?d.dx:0;while(++f<g)k=a[f],k.x=h,k.y=i,k.dx=j,i+=k.dy=j?b(k.area/j):0;k.z=!1,k.dy+=d.y+d.dy-i,d.x+=j,d.dx-=j}}function n(b){var d=g||a(b),e=d[0];return e.x=0,e.y=0,e.dx=c[0],e.dy=c[1],g&&a.revalue(e),i([e],e.dx*e.dy/e.value),(g?k:j)(e),f&&(g=d),d}var a=d3.layout.hierarchy(),b=Math.round,c=[1,1],d=null,e=bc,f=!1,g,h=.5*(1+Math.sqrt(5));return n.size=function(a){return arguments.length?(c=a,n):c},n.padding=function(a){function b(b){var c=a.call(n,b,b.depth);return c==null?bc(b):bd(b,typeof c=="number"?[c,c,c,c]:c)}function c(b){return bd(b,a)}if(!arguments.length)return d;var f;return e=(d=a)==null?bc:(f=typeof a)==="function"?b:f==="number"?(a=[a,a,a,a],c):c,n},n.round=function(a){return arguments.length?(b=a?Math.round:Number,n):b!=Number},n.sticky=function(a){return arguments.length?(f=a,g=null,n):f},n.ratio=function(a){return arguments.length?(h=a,n):h},z(n,a)}})();����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������rickshaw-1.4.6/vendor/d3.min.js���������������������������������������������������������������������0000664�0000000�0000000�00000157614�12251233401�0016267�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������(function(){function e(a){var b=-1,c=a.length,d=[];while(++b<c)d.push(a[b]);return d}function f(a){return Array.prototype.slice.call(a)}function i(){return this}function j(a){return a!=null&&!isNaN(a)}function k(a){return a.length}function l(a){return a==null}function m(a){return a.replace(/(^\s+)|(\s+$)/g,"").replace(/\s+/g," ")}function o(){}function p(){function c(){var b=a,c=-1,d=b.length,e;while(++c<d)(e=b[c])._on&&e.apply(this,arguments)}var a=[],b={};return c.on=function(d,e){var f,g;if(f=b[d])f._on=!1,a=a.slice(0,g=a.indexOf(f)).concat(a.slice(g+1)),delete b[d];return e&&(e._on=!0,a.push(e),b[d]=e),c},c}function s(a,b){return b-(a?1+Math.floor(Math.log(a+Math.pow(10,1+Math.floor(Math.log(a)/Math.LN10)-b))/Math.LN10):1)}function t(a){return a+""}function u(a){var b=a.lastIndexOf("."),c=b>=0?a.substring(b):(b=a.length,""),d=[];while(b>0)d.push(a.substring(b-=3,b+3));return d.reverse().join(",")+c}function w(a,b){return{scale:Math.pow(10,(8-b)*3),symbol:a}}function B(a){return function(b){return b<=0?0:b>=1?1:a(b)}}function C(a){return function(b){return 1-a(1-b)}}function D(a){return function(b){return.5*(b<.5?a(2*b):2-a(2-2*b))}}function E(a){return a}function F(a){return function(b){return Math.pow(b,a)}}function G(a){return 1-Math.cos(a*Math.PI/2)}function H(a){return Math.pow(2,10*(a-1))}function I(a){return 1-Math.sqrt(1-a*a)}function J(a,b){var c;return arguments.length<2&&(b=.45),arguments.length<1?(a=1,c=b/4):c=b/(2*Math.PI)*Math.asin(1/a),function(d){return 1+a*Math.pow(2,10*-d)*Math.sin((d-c)*2*Math.PI/b)}}function K(a){return a||(a=1.70158),function(b){return b*b*((a+1)*b-a)}}function L(a){return a<1/2.75?7.5625*a*a:a<2/2.75?7.5625*(a-=1.5/2.75)*a+.75:a<2.5/2.75?7.5625*(a-=2.25/2.75)*a+.9375:7.5625*(a-=2.625/2.75)*a+.984375}function M(){d3.event.stopPropagation(),d3.event.preventDefault()}function O(a){return a=="transform"?d3.interpolateTransform:d3.interpolate}function P(a,b){return b=b-(a=+a)?1/(b-a):0,function(c){return(c-a)*b}}function Q(a,b){return b=b-(a=+a)?1/(b-a):0,function(c){return Math.max(0,Math.min(1,(c-a)*b))}}function R(a,b,c){return new S(a,b,c)}function S(a,b,c){this.r=a,this.g=b,this.b=c}function T(a){return a<16?"0"+Math.max(0,a).toString(16):Math.min(255,a).toString(16)}function U(a,b,c){var d=0,e=0,f=0,g,h,i;g=/([a-z]+)\((.*)\)/i.exec(a);if(g){h=g[2].split(",");switch(g[1]){case"hsl":return c(parseFloat(h[0]),parseFloat(h[1])/100,parseFloat(h[2])/100);case"rgb":return b(W(h[0]),W(h[1]),W(h[2]))}}return(i=X[a])?b(i.r,i.g,i.b):(a!=null&&a.charAt(0)==="#"&&(a.length===4?(d=a.charAt(1),d+=d,e=a.charAt(2),e+=e,f=a.charAt(3),f+=f):a.length===7&&(d=a.substring(1,3),e=a.substring(3,5),f=a.substring(5,7)),d=parseInt(d,16),e=parseInt(e,16),f=parseInt(f,16)),b(d,e,f))}function V(a,b,c){var d=Math.min(a/=255,b/=255,c/=255),e=Math.max(a,b,c),f=e-d,g,h,i=(e+d)/2;return f?(h=i<.5?f/(e+d):f/(2-e-d),a==e?g=(b-c)/f+(b<c?6:0):b==e?g=(c-a)/f+2:g=(a-b)/f+4,g*=60):h=g=0,Z(g,h,i)}function W(a){var b=parseFloat(a);return a.charAt(a.length-1)==="%"?Math.round(b*2.55):b}function Z(a,b,c){return new $(a,b,c)}function $(a,b,c){this.h=a,this.s=b,this.l=c}function _(a,b,c){function f(a){return a>360?a-=360:a<0&&(a+=360),a<60?d+(e-d)*a/60:a<180?e:a<240?d+(e-d)*(240-a)/60:d}function g(a){return Math.round(f(a)*255)}var d,e;return a%=360,a<0&&(a+=360),b=b<0?0:b>1?1:b,c=c<0?0:c>1?1:c,e=c<=.5?c*(1+b):c+b-c*b,d=2*c-e,R(g(a+120),g(a),g(a-120))}function ba(a){return h(a,bd),a}function be(a){return function(){return bb(a,this)}}function bf(a){return function(){return bc(a,this)}}function bh(a,b){function f(){if(b=this.classList)return b.add(a);var b=this.className,d=b.baseVal!=null,e=d?b.baseVal:b;c.lastIndex=0,c.test(e)||(e=m(e+" "+a),d?b.baseVal=e:this.className=e)}function g(){if(b=this.classList)return b.remove(a);var b=this.className,d=b.baseVal!=null,e=d?b.baseVal:b;e=m(e.replace(c," ")),d?b.baseVal=e:this.className=e}function h(){(b.apply(this,arguments)?f:g).call(this)}var c=new RegExp("(^|\\s+)"+d3.requote(a)+"(\\s+|$)","g");if(arguments.length<2){var d=this.node();if(e=d.classList)return e.contains(a);var e=d.className;return c.lastIndex=0,c.test(e.baseVal!=null?e.baseVal:e)}return this.each(typeof b=="function"?h:b?f:g)}function bi(a){return{__data__:a}}function bj(a){return arguments.length||(a=d3.ascending),function(b,c){return a(b&&b.__data__,c&&c.__data__)}}function bl(a){return h(a,bm),a}function bn(a,b,c){h(a,br);var d={},e=d3.dispatch("start","end"),f=bu;return a.id=b,a.time=c,a.tween=function(b,c){return arguments.length<2?d[b]:(c==null?delete d[b]:d[b]=c,a)},a.ease=function(b){return arguments.length?(f=typeof b=="function"?b:d3.ease.apply(d3,arguments),a):f},a.each=function(b,c){return arguments.length<2?bv.call(a,b):(e.on(b,c),a)},d3.timer(function(g){return a.each(function(h,i,j){function p(a){if(o.active>b)return r();o.active=b;for(var f in d)(f=d[f].call(l,h,i))&&k.push(f);return e.start.call(l,h,i),q(a)||d3.timer(q,0,c),1}function q(a){if(o.active!==b)return r();var c=(a-m)/n,d=f(c),g=k.length;while(g>0)k[--g].call(l,d);if(c>=1)return r(),bt=b,e.end.call(l,h,i),bt=0,1}function r(){return--o.count||delete l.__transition__,1}var k=[],l=this,m=a[j][i].delay,n=a[j][i].duration,o=l.__transition__||(l.__transition__={active:0,count:0});++o.count,m<=g?p(g):d3.timer(p,m,c)}),1},0,c),a}function bp(a,b,c){return c!=""&&bo}function bq(a,b){function d(a,d,e){var f=b.call(this,a,d);return f==null?e!=""&&bo:e!=f&&c(e,f)}function e(a,d,e){return e!=b&&c(e,b)}var c=O(a);return typeof b=="function"?d:b==null?bp:(b+="",e)}function bv(a){for(var b=0,c=this.length;b<c;b++)for(var d=this[b],e=0,f=d.length;e<f;e++){var g=d[e];g&&a.call(g=g.node,g.__data__,e,b)}return this}function bz(){var a,b=Date.now(),c=bw;while(c)a=b-c.then,a>=c.delay&&(c.flush=c.callback(a)),c=c.next;var d=bA()-b;d>24?(isFinite(d)&&(clearTimeout(by),by=setTimeout(bz,d)),bx=0):(bx=1,bB(bz))}function bA(){var a=null,b=bw,c=Infinity;while(b)b.flush?b=a?a.next=b.next:bw=b.next:(c=Math.min(c,b.then+b.delay),b=(a=b).next);return c}function bC(a){var b=[a.a,a.b],c=[a.c,a.d],d=bE(b),e=bD(b,c),f=bE(bF(c,b,-e));this.translate=[a.e,a.f],this.rotate=Math.atan2(a.b,a.a)*bH,this.scale=[d,f||0],this.skew=f?e/f*bH:0}function bD(a,b){return a[0]*b[0]+a[1]*b[1]}function bE(a){var b=Math.sqrt(bD(a,a));return a[0]/=b,a[1]/=b,b}function bF(a,b,c){return a[0]+=c*b[0],a[1]+=c*b[1],a}function bI(){}function bJ(a){var b=a[0],c=a[a.length-1];return b<c?[b,c]:[c,b]}function bK(a,b){var c=0,d=a.length-1,e=a[c],f=a[d],g;f<e&&(g=c,c=d,d=g,g=e,e=f,f=g);if(g=f-e)b=b(g),a[c]=b.floor(e),a[d]=b.ceil(f);return a}function bL(){return Math}function bM(a,b,c,d){function g(){var g=a.length==2?bS:bT,i=d?Q:P;return e=g(a,b,i,c),f=g(b,a,i,d3.interpolate),h}function h(a){return e(a)}var e,f;return h.invert=function(a){return f(a)},h.domain=function(b){return arguments.length?(a=b.map(Number),g()):a},h.range=function(a){return arguments.length?(b=a,g()):b},h.rangeRound=function(a){return h.range(a).interpolate(d3.interpolateRound)},h.clamp=function(a){return arguments.length?(d=a,g()):d},h.interpolate=function(a){return arguments.length?(c=a,g()):c},h.ticks=function(b){return bQ(a,b)},h.tickFormat=function(b){return bR(a,b)},h.nice=function(){return bK(a,bO),g()},h.copy=function(){return bM(a,b,c,d)},g()}function bN(a,b){return a.range=d3.rebind(a,b.range),a.rangeRound=d3.rebind(a,b.rangeRound),a.interpolate=d3.rebind(a,b.interpolate),a.clamp=d3.rebind(a,b.clamp),a}function bO(a){return a=Math.pow(10,Math.round(Math.log(a)/Math.LN10)-1),{floor:function(b){return Math.floor(b/a)*a},ceil:function(b){return Math.ceil(b/a)*a}}}function bP(a,b){var c=bJ(a),d=c[1]-c[0],e=Math.pow(10,Math.floor(Math.log(d/b)/Math.LN10)),f=b/d*e;return f<=.15?e*=10:f<=.35?e*=5:f<=.75&&(e*=2),c[0]=Math.ceil(c[0]/e)*e,c[1]=Math.floor(c[1]/e)*e+e*.5,c[2]=e,c}function bQ(a,b){return d3.range.apply(d3,bP(a,b))}function bR(a,b){return d3.format(",."+Math.max(0,-Math.floor(Math.log(bP(a,b)[2])/Math.LN10+.01))+"f")}function bS(a,b,c,d){var e=c(a[0],a[1]),f=d(b[0],b[1]);return function(a){return f(e(a))}}function bT(a,b,c,d){var e=[],f=[],g=0,h=a.length;while(++g<h)e.push(c(a[g-1],a[g])),f.push(d(b[g-1],b[g]));return function(b){var c=d3.bisect(a,b,1,a.length-1)-1;return f[c](e[c](b))}}function bU(a,b){function d(c){return a(b(c))}var c=b.pow;return d.invert=function(b){return c(a.invert(b))},d.domain=function(e){return arguments.length?(b=e[0]<0?bX:bW,c=b.pow,a.domain(e.map(b)),d):a.domain().map(c)},d.nice=function(){return a.domain(bK(a.domain(),bL)),d},d.ticks=function(){var d=bJ(a.domain()),e=[];if(d.every(isFinite)){var f=Math.floor(d[0]),g=Math.ceil(d[1]),h=Math.round(c(d[0])),i=Math.round(c(d[1]));if(b===bX){e.push(c(f));for(;f++<g;)for(var j=9;j>0;j--)e.push(c(f)*j)}else{for(;f<g;f++)for(var j=1;j<10;j++)e.push(c(f)*j);e.push(c(f))}for(f=0;e[f]<h;f++);for(g=e.length;e[g-1]>i;g--);e=e.slice(f,g)}return e},d.tickFormat=function(a,e){arguments.length<2&&(e=bV);if(arguments.length<1)return e;var f=a/d.ticks().length,g=b===bX?(h=-1e-15,Math.floor):(h=1e-15,Math.ceil),h;return function(a){return a/c(g(b(a)+h))<f?e(a):""}},d.copy=function(){return bU(a.copy(),b)},bN(d,a)}function bW(a){return Math.log(a)/Math.LN10}function bX(a){return-Math.log(-a)/Math.LN10}function bY(a,b){function e(b){return a(c(b))}var c=bZ(b),d=bZ(1/b);return e.invert=function(b){return d(a.invert(b))},e.domain=function(b){return arguments.length?(a.domain(b.map(c)),e):a.domain().map(d)},e.ticks=function(a){return bQ(e.domain(),a)},e.tickFormat=function(a){return bR(e.domain(),a)},e.nice=function(){return e.domain(bK(e.domain(),bO))},e.exponent=function(a){if(!arguments.length)return b;var f=e.domain();return c=bZ(b=a),d=bZ(1/b),e.domain(f)},e.copy=function(){return bY(a.copy(),b)},bN(e,a)}function bZ(a){return function(b){return b<0?-Math.pow(-b,a):Math.pow(b,a)}}function b$(a,b){function f(b){return d[((c[b]||(c[b]=a.push(b)))-1)%d.length]}function g(b,c){return d3.range(a.length).map(function(a){return b+c*a})}var c,d,e;return f.domain=function(d){if(!arguments.length)return a;a=[],c={};var e=-1,g=d.length,h;while(++e<g)c[h=d[e]]||(c[h]=a.push(h));return f[b.t](b.x,b.p)},f.range=function(a){return arguments.length?(d=a,e=0,b={t:"range",x:a},f):d},f.rangePoints=function(c,h){arguments.length<2&&(h=0);var i=c[0],j=c[1],k=(j-i)/(a.length-1+h);return d=g(a.length<2?(i+j)/2:i+k*h/2,k),e=0,b={t:"rangePoints",x:c,p:h},f},f.rangeBands=function(c,h){arguments.length<2&&(h=0);var i=c[0],j=c[1],k=(j-i)/(a.length+h);return d=g(i+k*h,k),e=k*(1-h),b={t:"rangeBands",x:c,p:h},f},f.rangeRoundBands=function(c,h){arguments.length<2&&(h=0);var i=c[0],j=c[1],k=Math.floor((j-i)/(a.length+h));return d=g(i+Math.round((j-i-(a.length-h)*k)/2),k),e=Math.round(k*(1-h)),b={t:"rangeRoundBands",x:c,p:h},f},f.rangeBand=function(){return e},f.copy=function(){return b$(a,b)},f.domain(a)}function cd(a,b){function d(){var d=0,f=a.length,g=b.length;c=[];while(++d<g)c[d-1]=d3.quantile(a,d/g);return e}function e(a){return isNaN(a=+a)?NaN:b[d3.bisect(c,a)]}var c;return e.domain=function(b){return arguments.length?(a=b.filter(function(a){return!isNaN(a)}).sort(d3.ascending),d()):a},e.range=function(a){return arguments.length?(b=a,d()):b},e.quantiles=function(){return c},e.copy=function(){return cd(a,b)},d()}function ce(a,b,c){function f(b){return c[Math.max(0,Math.min(e,Math.floor(d*(b-a))))]}function g(){return d=c.length/(b-a),e=c.length-1,f}var d,e;return f.domain=function(c){return arguments.length?(a=+c[0],b=+c[c.length-1],g()):[a,b]},f.range=function(a){return arguments.length?(c=a,g()):c},f.copy=function(){return ce(a,b,c)},g()}function ch(a){return a.innerRadius}function ci(a){return a.outerRadius}function cj(a){return a.startAngle}function ck(a){return a.endAngle}function cl(a){function g(d){return d.length<1?null:"M"+e(a(cm(this,d,b,c)),f)}var b=cn,c=co,d="linear",e=cp[d],f=.7;return g.x=function(a){return arguments.length?(b=a,g):b},g.y=function(a){return arguments.length?(c=a,g):c},g.interpolate=function(a){return arguments.length?(e=cp[d=a],g):d},g.tension=function(a){return arguments.length?(f=a,g):f},g}function cm(a,b,c,d){var e=[],f=-1,g=b.length,h=typeof c=="function",i=typeof d=="function",j;if(h&&i)while(++f<g)e.push([c.call(a,j=b[f],f),d.call(a,j,f)]);else if(h)while(++f<g)e.push([c.call(a,b[f],f),d]);else if(i)while(++f<g)e.push([c,d.call(a,b[f],f)]);else while(++f<g)e.push([c,d]);return e}function cn(a){return a[0]}function co(a){return a[1]}function cq(a){var b=0,c=a.length,d=a[0],e=[d[0],",",d[1]];while(++b<c)e.push("L",(d=a[b])[0],",",d[1]);return e.join("")}function cr(a){var b=0,c=a.length,d=a[0],e=[d[0],",",d[1]];while(++b<c)e.push("V",(d=a[b])[1],"H",d[0]);return e.join("")}function cs(a){var b=0,c=a.length,d=a[0],e=[d[0],",",d[1]];while(++b<c)e.push("H",(d=a[b])[0],"V",d[1]);return e.join("")}function ct(a,b){return a.length<4?cq(a):a[1]+cw(a.slice(1,a.length-1),cx(a,b))}function cu(a,b){return a.length<3?cq(a):a[0]+cw((a.push(a[0]),a),cx([a[a.length-2]].concat(a,[a[1]]),b))}function cv(a,b,c){return a.length<3?cq(a):a[0]+cw(a,cx(a,b))}function cw(a,b){if(b.length<1||a.length!=b.length&&a.length!=b.length+2)return cq(a);var c=a.length!=b.length,d="",e=a[0],f=a[1],g=b[0],h=g,i=1;c&&(d+="Q"+(f[0]-g[0]*2/3)+","+(f[1]-g[1]*2/3)+","+f[0]+","+f[1],e=a[1],i=2);if(b.length>1){h=b[1],f=a[i],i++,d+="C"+(e[0]+g[0])+","+(e[1]+g[1])+","+(f[0]-h[0])+","+(f[1]-h[1])+","+f[0]+","+f[1];for(var j=2;j<b.length;j++,i++)f=a[i],h=b[j],d+="S"+(f[0]-h[0])+","+(f[1]-h[1])+","+f[0]+","+f[1]}if(c){var k=a[i];d+="Q"+(f[0]+h[0]*2/3)+","+(f[1]+h[1]*2/3)+","+k[0]+","+k[1]}return d}function cx(a,b){var c=[],d=(1-b)/2,e,f=a[0],g=a[1],h=1,i=a.length;while(++h<i)e=f,f=g,g=a[h],c.push([d*(g[0]-e[0]),d*(g[1]-e[1])]);return c}function cy(a){if(a.length<3)return cq(a);var b=1,c=a.length,d=a[0],e=d[0],f=d[1],g=[e,e,e,(d=a[1])[0]],h=[f,f,f,d[1]],i=[e,",",f];cG(i,g,h);while(++b<c)d=a[b],g.shift(),g.push(d[0]),h.shift(),h.push(d[1]),cG(i,g,h);b=-1;while(++b<2)g.shift(),g.push(d[0]),h.shift(),h.push(d[1]),cG(i,g,h);return i.join("")}function cz(a){if(a.length<4)return cq(a);var b=[],c=-1,d=a.length,e,f=[0],g=[0];while(++c<3)e=a[c],f.push(e[0]),g.push(e[1]);b.push(cC(cF,f)+","+cC(cF,g)),--c;while(++c<d)e=a[c],f.shift(),f.push(e[0]),g.shift(),g.push(e[1]),cG(b,f,g);return b.join("")}function cA(a){var b,c=-1,d=a.length,e=d+4,f,g=[],h=[];while(++c<4)f=a[c%d],g.push(f[0]),h.push(f[1]);b=[cC(cF,g),",",cC(cF,h)],--c;while(++c<e)f=a[c%d],g.shift(),g.push(f[0]),h.shift(),h.push(f[1]),cG(b,g,h);return b.join("")}function cB(a,b){var c=a.length-1,d=a[0][0],e=a[0][1],f=a[c][0]-d,g=a[c][1]-e,h=-1,i,j;while(++h<=c)i=a[h],j=h/c,i[0]=b*i[0]+(1-b)*(d+j*f),i[1]=b*i[1]+(1-b)*(e+j*g);return cy(a)}function cC(a,b){return a[0]*b[0]+a[1]*b[1]+a[2]*b[2]+a[3]*b[3]}function cG(a,b,c){a.push("C",cC(cD,b),",",cC(cD,c),",",cC(cE,b),",",cC(cE,c),",",cC(cF,b),",",cC(cF,c))}function cH(a,b){return(b[1]-a[1])/(b[0]-a[0])}function cI(a){var b=0,c=a.length-1,d=[],e=a[0],f=a[1],g=d[0]=cH(e,f);while(++b<c)d[b]=g+(g=cH(e=f,f=a[b+1]));return d[b]=g,d}function cJ(a){var b=[],c,d,e,f,g=cI(a),h=-1,i=a.length-1;while(++h<i)c=cH(a[h],a[h+1]),Math.abs(c)<1e-6?g[h]=g[h+1]=0:(d=g[h]/c,e=g[h+1]/c,f=d*d+e*e,f>9&&(f=c*3/Math.sqrt(f),g[h]=f*d,g[h+1]=f*e));h=-1;while(++h<=i)f=(a[Math.min(i,h+1)][0]-a[Math.max(0,h-1)][0])/(6*(1+g[h]*g[h])),b.push([f||0,g[h]*f||0]);return b}function cK(a){return a.length<3?cq(a):a[0]+cw(a,cJ(a))}function cL(a){var b,c=-1,d=a.length,e,f;while(++c<d)b=a[c],e=b[0],f=b[1]+cf,b[0]=e*Math.cos(f),b[1]=e*Math.sin(f);return a}function cM(a){function j(f){if(f.length<1)return null;var j=cm(this,f,b,d),k=cm(this,f,b===c?cN(j):c,d===e?cO(j):e);return"M"+g(a(k),i)+"L"+h(a(j.reverse()),i)+"Z"}var b=cn,c=cn,d=0,e=co,f,g,h,i=.7;return j.x=function(a){return arguments.length?(b=c=a,j):c},j.x0=function(a){return arguments.length?(b=a,j):b},j.x1=function(a){return arguments.length?(c=a,j):c},j.y=function(a){return arguments.length?(d=e=a,j):e},j.y0=function(a){return arguments.length?(d=a,j):d},j.y1=function(a){return arguments.length?(e=a,j):e},j.interpolate=function(a){return arguments.length?(g=cp[f=a],h=g.reverse||g,j):f},j.tension=function(a){return arguments.length?(i=a,j):i},j.interpolate("linear")}function cN(a){return function(b,c){return a[c][0]}}function cO(a){return function(b,c){return a[c][1]}}function cP(a){return a.source}function cQ(a){return a.target}function cR(a){return a.radius}function cS(a){return a.startAngle}function cT(a){return a.endAngle}function cU(a){return[a.x,a.y]}function cV(a){return function(){var b=a.apply(this,arguments),c=b[0],d=b[1]+cf;return[c*Math.cos(d),c*Math.sin(d)]}}function cX(a,b){var c=(a.ownerSVGElement||a).createSVGPoint();if(cW<0&&(window.scrollX||window.scrollY)){var d=d3.select(document.body).append("svg:svg").style("position","absolute").style("top",0).style("left",0),e=d[0][0].getScreenCTM();cW=!e.f&&!e.e,d.remove()}return cW?(c.x=b.pageX,c.y=b.pageY):(c.x=b.clientX,c.y=b.clientY),c=c.matrixTransform(a.getScreenCTM().inverse()),[c.x,c.y]}function cY(){return 64}function cZ(){return"circle"}function db(a,b){a.attr("transform",function(a){return"translate("+b(a)+",0)"})}function dc(a,b){a.attr("transform",function(a){return"translate(0,"+b(a)+")"})}function dd(a,b,c){e=[];if(c&&b.length>1){var d=bJ(a.domain()),e,f=-1,g=b.length,h=(b[1]-b[0])/++c,i,j;while(++f<g)for(i=c;--i>0;)(j=+b[f]-i*h)>=d[0]&&e.push(j);for(--f,i=0;++i<c&&(j=+b[f]+i*h)<d[1];)e.push(j)}return e}function dp(a,b){a.select(".extent").attr("x",b[0][0]),a.selectAll(".n,.s,.w,.nw,.sw").attr("x",b[0][0]-2),a.selectAll(".e,.ne,.se").attr("x",b[1][0]-3),a.selectAll(".extent,.n,.s").attr("width",b[1][0]-b[0][0])}function dq(a,b){a.select(".extent").attr("y",b[0][1]),a.selectAll(".n,.e,.w,.nw,.ne").attr("y",b[0][1]-3),a.selectAll(".s,.se,.sw").attr("y",b[1][1]-4),a.selectAll(".extent,.e,.w").attr("height",b[1][1]-b[0][1])}function dr(){d3.event.keyCode==32&&dg&&!dk&&(dm=null,dn[0]-=dj[1][0],dn[1]-=dj[1][1],dk=2,M())}function ds(){d3.event.keyCode==32&&dk==2&&(dn[0]+=dj[1][0],dn[1]+=dj[1][1],dk=0,M())}function dt(){if(dn){var a=d3.svg.mouse(dg),b=d3.select(dg);dk||(d3.event.altKey?(dm||(dm=[(dj[0][0]+dj[1][0])/2,(dj[0][1]+dj[1][1])/2]),dn[0]=dj[+(a[0]<dm[0])][0],dn[1]=dj[+(a[1]<dm[1])][1]):dm=null),dh&&(du(a,dh,0),dp(b,dj)),di&&(du(a,di,1),dq(b,dj)),df("brush")}}function du(a,b,c){var d=bJ(b.range()),e=dn[c],f=dj[1][c]-dj[0][c],g,h;dk&&(d[0]-=e,d[1]-=f+e),g=Math.max(d[0],Math.min(d[1],a[c])),dk?h=(g+=e)+f:(dm&&(e=Math.max(d[0],Math.min(d[1],2*dm[c]-g))),e<g?(h=g,g=e):h=e),dj[0][c]=g,dj[1][c]=h}function dv(){dn&&(dt(),d3.select(dg).selectAll(".resize").style("pointer-events",de.empty()?"none":"all"),df("brushend"),de=df=dg=dh=di=dj=dk=dl=dm=dn=null,M())}function dE(a){var b=d3.event,c=dz.parentNode,d=0,e=0;c&&(c=dF(c),d=c[0]-dB[0],e=c[1]-dB[1],dB=c,dC|=d|e);try{d3.event={dx:d,dy:e},dx[a].apply(dz,dA)}finally{d3.event=b}b.preventDefault()}function dF(a,b){var c=d3.event.changedTouches;return c?d3.svg.touches(a,c)[0]:d3.svg.mouse(a)}function dG(){if(!dz)return;var a=dz.parentNode;if(!a)return dH();dE("drag"),M()}function dH(){if(!dz)return;dE("dragend"),dz=null,dC&&dy===d3.event.target&&(dD=!0,M())}function dI(){dD&&dy===d3.event.target&&(M(),dD=!1,dy=null)}function dW(a){return[a[0]-dO[0],a[1]-dO[1],dO[2]]}function dX(){dJ||(dJ=d3.select("body").append("div").style("visibility","hidden").style("top",0).style("height",0).style("width",0).style("overflow-y","scroll").append("div").style("height","2000px").node().parentNode);var a=d3.event,b;try{dJ.scrollTop=1e3,dJ.dispatchEvent(a),b=1e3-dJ.scrollTop}catch(c){b=a.wheelDelta||-a.detail*5}return b*.005}function dY(){var a=d3.svg.touches(dS),b=-1,c=a.length,d;while(++b<c)dM[(d=a[b]).identifier]=dW(d);return a}function dZ(){var a=d3.svg.touches(dS);switch(a.length){case 1:var b=a[0];eb(dO[2],b,dM[b.identifier]);break;case 2:var c=a[0],d=a[1],e=[(c[0]+d[0])/2,(c[1]+d[1])/2],f=dM[c.identifier],g=dM[d.identifier],h=[(f[0]+g[0])/2,(f[1]+g[1])/2,f[2]];eb(Math.log(d3.event.scale)/Math.LN2+f[2],e,h)}}function d$(){dL=null,dK&&(dU=!0,eb(dO[2],d3.svg.mouse(dS),dK))}function d_(){dK&&(dU&&dR===d3.event.target&&(dV=!0),d$(),dK=null)}function ea(){dV&&dR===d3.event.target&&(d3.event.stopPropagation(),d3.event.preventDefault(),dV=!1,dR=null)}function eb(a,b,c){function l(a,b,c){a.domain(a.range().map(function(f){return a.invert((f-c)*d/e+b)}))}a=ed(a,2);var d=Math.pow(2,dO[2]),e=Math.pow(2,a),f=Math.pow(2,(dO[2]=a)-c[2]),g=dO[0],h=dO[1],i=dO[0]=ed(b[0]-c[0]*f,0,e),j=dO[1]=ed(b[1]-c[1]*f,1,e),k=d3.event;d3.event={scale:e,translate:[i,j],transform:function(a,b){a&&l(a,g,i),b&&l(b,h,j)}};try{dQ.apply(dS,dT)}finally{d3.event=k}k.preventDefault()}function ed(a,b,c){var d=dP[b],e=d[0],f=d[1];return arguments.length===3?Math.max(f*(f===Infinity?-Infinity:1/c-1),Math.min(e===-Infinity?Infinity:e,a/c))*c:Math.max(e,Math.min(f,a))}Date.now||(Date.now=function(){return+(new Date)});try{document.createElement("div").style.setProperty("opacity",0,"")}catch(a){var b=CSSStyleDeclaration.prototype,c=b.setProperty;b.setProperty=function(a,b,d){c.call(this,a,b+"",d)}}d3={version:"2.5.0"};var d=f;try{d(document.documentElement.childNodes)[0].nodeType}catch(g){d=e}var h=[].__proto__?function(a,b){a.__proto__=b}:function(a,b){for(var c in b)a[c]=b[c]};d3.functor=function(a){return typeof a=="function"?a:function(){return a}},d3.rebind=function(a,b){return function(){var c=b.apply(a,arguments);return arguments.length?a:c}},d3.ascending=function(a,b){return a<b?-1:a>b?1:a>=b?0:NaN},d3.descending=function(a,b){return b<a?-1:b>a?1:b>=a?0:NaN},d3.mean=function(a,b){var c=a.length,d,e=0,f=-1,g=0;if(arguments.length===1)while(++f<c)j(d=a[f])&&(e+=(d-e)/++g);else while(++f<c)j(d=b.call(a,a[f],f))&&(e+=(d-e)/++g);return g?e:undefined},d3.median=function(a,b){return arguments.length>1&&(a=a.map(b)),a=a.filter(j),a.length?d3.quantile(a.sort(d3.ascending),.5):undefined},d3.min=function(a,b){var c=-1,d=a.length,e,f;if(arguments.length===1){while(++c<d&&((e=a[c])==null||e!=e))e=undefined;while(++c<d)(f=a[c])!=null&&e>f&&(e=f)}else{while(++c<d&&((e=b.call(a,a[c],c))==null||e!=e))e=undefined;while(++c<d)(f=b.call(a,a[c],c))!=null&&e>f&&(e=f)}return e},d3.max=function(a,b){var c=-1,d=a.length,e,f;if(arguments.length===1){while(++c<d&&((e=a[c])==null||e!=e))e=undefined;while(++c<d)(f=a[c])!=null&&f>e&&(e=f)}else{while(++c<d&&((e=b.call(a,a[c],c))==null||e!=e))e=undefined;while(++c<d)(f=b.call(a,a[c],c))!=null&&f>e&&(e=f)}return e},d3.extent=function(a,b){var c=-1,d=a.length,e,f,g;if(arguments.length===1){while(++c<d&&((e=g=a[c])==null||e!=e))e=g=undefined;while(++c<d)(f=a[c])!=null&&(e>f&&(e=f),g<f&&(g=f))}else{while(++c<d&&((e=g=b.call(a,a[c],c))==null||e!=e))e=undefined;while(++c<d)(f=b.call(a,a[c],c))!=null&&(e>f&&(e=f),g<f&&(g=f))}return[e,g]},d3.random={normal:function(a,b){return arguments.length<2&&(b=1),arguments.length<1&&(a=0),function(){var c,d,e;do c=Math.random()*2-1,d=Math.random()*2-1,e=c*c+d*d;while(!e||e>1);return a+b*c*Math.sqrt(-2*Math.log(e)/e)}}},d3.sum=function(a,b){var c=0,d=a.length,e,f=-1;if(arguments.length===1)while(++f<d)isNaN(e=+a[f])||(c+=e);else while(++f<d)isNaN(e=+b.call(a,a[f],f))||(c+=e);return c},d3.quantile=function(a,b){var c=(a.length-1)*b+1,d=Math.floor(c),e=a[d-1],f=c-d;return f?e+f*(a[d]-e):e},d3.zip=function(){if(!(e=arguments.length))return[];for(var a=-1,b=d3.min(arguments,k),c=new Array(b);++a<b;)for(var d=-1,e,f=c[a]=new Array(e);++d<e;)f[d]=arguments[d][a];return c},d3.bisectLeft=function(a,b,c,d){arguments.length<3&&(c=0),arguments.length<4&&(d=a.length);while(c<d){var e=c+d>>1;a[e]<b?c=e+1:d=e}return c},d3.bisect=d3.bisectRight=function(a,b,c,d){arguments.length<3&&(c=0),arguments.length<4&&(d=a.length);while(c<d){var e=c+d>>1;b<a[e]?d=e:c=e+1}return c},d3.first=function(a,b){var c=0,d=a.length,e=a[0],f;arguments.length===1&&(b=d3.ascending);while(++c<d)b.call(a,e,f=a[c])>0&&(e=f);return e},d3.last=function(a,b){var c=0,d=a.length,e=a[0],f;arguments.length===1&&(b=d3.ascending);while(++c<d)b.call(a,e,f=a[c])<=0&&(e=f);return e},d3.nest=function(){function f(c,g){if(g>=b.length)return e?e.call(a,c):d?c.sort(d):c;var h=-1,i=c.length,j=b[g++],k,l,m={};while(++h<i)(k=j(l=c[h]))in m?m[k].push(l):m[k]=[l];for(k in m)m[k]=f(m[k],g);return m}function g(a,d){if(d>=b.length)return a;var e=[],f=c[d++],h;for(h in a)e.push({key:h,values:g(a[h],d)});return f&&e.sort(function(a,b){return f(a.key,b.key)}),e}var a={},b=[],c=[],d,e;return a.map=function(a){return f(a,0)},a.entries=function(a){return g(f(a,0),0)},a.key=function(c){return b.push(c),a},a.sortKeys=function(d){return c[b.length-1]=d,a},a.sortValues=function(b){return d=b,a},a.rollup=function(b){return e=b,a},a},d3.keys=function(a){var b=[];for(var c in a)b.push(c);return b},d3.values=function(a){var b=[];for(var c in a)b.push(a[c]);return b},d3.entries=function(a){var b=[];for(var c in a)b.push({key:c,value:a[c]});return b},d3.permute=function(a,b){var c=[],d=-1,e=b.length;while(++d<e)c[d]=a[b[d]];return c},d3.merge=function(a){return Array.prototype.concat.apply([],a)},d3.split=function(a,b){var c=[],d=[],e,f=-1,g=a.length;arguments.length<2&&(b=l);while(++f<g)b.call(d,e=a[f],f)?d=[]:(d.length||c.push(d),d.push(e));return c},d3.range=function(a,b,c){arguments.length<3&&(c=1,arguments.length<2&&(b=a,a=0));if((b-a)/c==Infinity)throw new Error("infinite range");var d=[],e=-1,f;if(c<0)while((f=a+c*++e)>b)d.push(f);else while((f=a+c*++e)<b)d.push(f);return d},d3.requote=function(a){return a.replace(n,"\\$&")};var n=/[\\\^\$\*\+\?\|\[\]\(\)\.\{\}]/g;d3.round=function(a,b){return b?Math.round(a*Math.pow(10,b))*Math.pow(10,-b):Math.round(a)},d3.xhr=function(a,b,c){var d=new XMLHttpRequest;arguments.length<3?c=b:b&&d.overrideMimeType&&d.overrideMimeType(b),d.open("GET",a,!0),d.onreadystatechange=function(){d.readyState===4&&c(d.status<300?d:null)},d.send(null)},d3.text=function(a,b,c){function d(a){c(a&&a.responseText)}arguments.length<3&&(c=b,b=null),d3.xhr(a,b,d)},d3.json=function(a,b){d3.text(a,"application/json",function(a){b(a?JSON.parse(a):null)})},d3.html=function(a,b){d3.text(a,"text/html",function(a){if(a!=null){var c=document.createRange();c.selectNode(document.body),a=c.createContextualFragment(a)}b(a)})},d3.xml=function(a,b,c){function d(a){c(a&&a.responseXML)}arguments.length<3&&(c=b,b=null),d3.xhr(a,b,d)},d3.ns={prefix:{svg:"http://www.w3.org/2000/svg",xhtml:"http://www.w3.org/1999/xhtml",xlink:"http://www.w3.org/1999/xlink",xml:"http://www.w3.org/XML/1998/namespace",xmlns:"http://www.w3.org/2000/xmlns/"},qualify:function(a){var b=a.indexOf(":");return b<0?a:{space:d3.ns.prefix[a.substring(0,b)],local:a.substring(b+1)}}},d3.dispatch=function(){var a=new o,b=-1,c=arguments.length;while(++b<c)a[arguments[b]]=p();return a},o.prototype.on=function(a,b){var c=a.indexOf("."),d="";c>0&&(d=a.substring(c+1),a=a.substring(0,c)),this[a].on(d,b)},d3.format=function(a){var b=q.exec(a),c=b[1]||" ",d=b[3]||"",e=b[5],f=+b[6],g=b[7],h=b[8],i=b[9],j=1,k="",l=!1;h&&(h=+h.substring(1)),e&&(c="0",g&&(f-=Math.floor((f-1)/4)));switch(i){case"n":g=!0,i="g";break;case"%":j=100,k="%",i="f";break;case"p":j=100,k="%",i="r";break;case"d":l=!0,h=0;break;case"s":j=-1,i="r"}return i=="r"&&!h&&(i="g"),i=r[i]||t,function(a){if(l&&a%1)return"";var b=a<0&&(a=-a)?"−":d;if(j<0){var m=d3.formatPrefix(a,h);a*=m.scale,k=m.symbol}else a*=j;a=i(a,h);if(e){var n=a.length+b.length;n<f&&(a=(new Array(f-n+1)).join(c)+a),g&&(a=u(a)),a=b+a}else{g&&(a=u(a)),a=b+a;var n=a.length;n<f&&(a=(new Array(f-n+1)).join(c)+a)}return a+k}};var q=/(?:([^{])?([<>=^]))?([+\- ])?(#)?(0)?([0-9]+)?(,)?(\.[0-9]+)?([a-zA-Z%])?/,r={g:function(a,b){return a.toPrecision(b)},e:function(a,b){return a.toExponential(b)},f:function(a,b){return a.toFixed(b)},r:function(a,b){return d3.round(a,b=s(a,b)).toFixed(Math.max(0,Math.min(20,b)))}},v=["y","z","a","f","p","n","μ","m","","k","M","G","T","P","E","Z","Y"].map(w);d3.formatPrefix=function(a,b){var c=0;return a&&(a<0&&(a*=-1),b&&(a=d3.round(a,s(a,b))),c=1+Math.floor(1e-12+Math.log(a)/Math.LN10),c=Math.max(-24,Math.min(24,Math.floor((c<=0?c+1:c-1)/3)*3))),v[8+c/3]};var x=F(2),y=F(3),z={linear:function(){return E},poly:F,quad:function(){return x},cubic:function(){return y},sin:function(){return G},exp:function(){return H},circle:function(){return I},elastic:J,back:K,bounce:function(){return L}},A={"in":function(a){return a},out:C,"in-out":D,"out-in":function(a){return D(C(a))}};d3.ease=function(a){var b=a.indexOf("-"),c=b>=0?a.substring(0,b):a,d=b>=0?a.substring(b+1):"in";return B(A[d](z[c].apply(null,Array.prototype.slice.call(arguments,1))))},d3.event=null,d3.interpolate=function(a,b){var c=d3.interpolators.length,d;while(--c>=0&&!(d=d3.interpolators[c](a,b)));return d},d3.interpolateNumber=function(a,b){return b-=a,function(c){return a+b*c}},d3.interpolateRound=function(a,b){return b-=a,function(c){return Math.round(a+b*c)}},d3.interpolateString=function(a,b){var c,d,e,f=0,g=0,h=[],i=[],j,k;N.lastIndex=0;for(d=0;c=N.exec(b);++d)c.index&&h.push(b.substring(f,g=c.index)),i.push({i:h.length,x:c[0]}),h.push(null),f=N.lastIndex;f<b.length&&h.push(b.substring(f));for(d=0,j=i.length;(c=N.exec(a))&&d<j;++d){k=i[d];if(k.x==c[0]){if(k.i)if(h[k.i+1]==null){h[k.i-1]+=k.x,h.splice(k.i,1);for(e=d+1;e<j;++e)i[e].i--}else{h[k.i-1]+=k.x+h[k.i+1],h.splice(k.i,2);for(e=d+1;e<j;++e)i[e].i-=2}else if(h[k.i+1]==null)h[k.i]=k.x;else{h[k.i]=k.x+h[k.i+1],h.splice(k.i+1,1);for(e=d+1;e<j;++e)i[e].i--}i.splice(d,1),j--,d--}else k.x=d3.interpolateNumber(parseFloat(c[0]),parseFloat(k.x))}while(d<j)k=i.pop(),h[k.i+1]==null?h[k.i]=k.x:(h[k.i]=k.x+h[k.i+1],h.splice(k.i+1,1)),j--;return h.length===1?h[0]==null?i[0].x:function(){return b}:function(a){for(d=0;d<j;++d)h[(k=i[d]).i]=k.x(a);return h.join("")}},d3.interpolateTransform=function(a,b){return d3.interpolateString(d3.transform(a)+"",d3.transform(b)+"")},d3.interpolateRgb=function(a,b){a=d3.rgb(a),b=d3.rgb(b);var c=a.r,d=a.g,e=a.b,f=b.r-c,g=b.g-d,h=b.b-e;return function(a){return"#"+T(Math.round(c+f*a))+T(Math.round(d+g*a))+T(Math.round(e+h*a))}},d3.interpolateHsl=function(a,b){a=d3.hsl(a),b=d3.hsl(b);var c=a.h,d=a.s,e=a.l,f=b.h-c,g=b.s-d,h=b.l-e;return function(a){return _(c+f*a,d+g*a,e+h*a).toString()}},d3.interpolateArray=function(a,b){var c=[],d=[],e=a.length,f=b.length,g=Math.min(a.length,b.length),h;for(h=0;h<g;++h)c.push(d3.interpolate(a[h],b[h]));for(;h<e;++h)d[h]=a[h];for(;h<f;++h)d[h]=b[h];return function(a){for(h=0;h<g;++h)d[h]=c[h](a);return d}},d3.interpolateObject=function(a,b){var c={},d={},e;for(e in a)e in b?c[e]=O(e)(a[e],b[e]):d[e]=a[e];for(e in b)e in a||(d[e]=b[e]);return function(a){for(e in c)d[e]=c[e](a);return d}};var N=/[-+]?(?:\d*\.?\d+)(?:[eE][-+]?\d+)?/g;d3.interpolators=[d3.interpolateObject,function(a,b){return b instanceof Array&&d3.interpolateArray(a,b)},function(a,b){return typeof b=="string"&&d3.interpolateString(a+"",b)},function(a,b){return(typeof b=="string"?b in X||/^(#|rgb\(|hsl\()/.test(b):b instanceof S||b instanceof $)&&d3.interpolateRgb(a+"",b)},function(a,b){return typeof b=="number"&&d3.interpolateNumber(+a,b)}],d3.rgb=function(a,b,c){return arguments.length===1?a instanceof S?R(a.r,a.g,a.b):U(""+a,R,_):R(~~a,~~b,~~c)},S.prototype.brighter=function(a){a=Math.pow(.7,arguments.length?a:1);var b=this.r,c=this.g,d=this.b,e=30;return!b&&!c&&!d?R(e,e,e):(b&&b<e&&(b=e),c&&c<e&&(c=e),d&&d<e&&(d=e),R(Math.min(255,Math.floor(b/a)),Math.min(255,Math.floor(c/a)),Math.min(255,Math.floor(d/a))))},S.prototype.darker=function(a){return a=Math.pow(.7,arguments.length?a:1),R(Math.floor(a*this.r),Math.floor(a*this.g),Math.floor(a*this.b))},S.prototype.hsl=function(){return V(this.r,this.g,this.b)},S.prototype.toString=function(){return"#"+T(this.r)+T(this.g)+T(this.b)};var X={aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aqua:"#00ffff",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",black:"#000000",blanchedalmond:"#ffebcd",blue:"#0000ff",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyan:"#00ffff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",darkgreen:"#006400",darkgrey:"#a9a9a9",darkkhaki:"#bdb76b",darkmagenta:"#8b008b",darkolivegreen:"#556b2f",darkorange:"#ff8c00",darkorchid:"#9932cc",darkred:"#8b0000",darksalmon:"#e9967a",darkseagreen:"#8fbc8f",darkslateblue:"#483d8b",darkslategray:"#2f4f4f",darkslategrey:"#2f4f4f",darkturquoise:"#00ced1",darkviolet:"#9400d3",deeppink:"#ff1493",deepskyblue:"#00bfff",dimgray:"#696969",dimgrey:"#696969",dodgerblue:"#1e90ff",firebrick:"#b22222",floralwhite:"#fffaf0",forestgreen:"#228b22",fuchsia:"#ff00ff",gainsboro:"#dcdcdc",ghostwhite:"#f8f8ff",gold:"#ffd700",goldenrod:"#daa520",gray:"#808080"
    ,green:"#008000",greenyellow:"#adff2f",grey:"#808080",honeydew:"#f0fff0",hotpink:"#ff69b4",indianred:"#cd5c5c",indigo:"#4b0082",ivory:"#fffff0",khaki:"#f0e68c",lavender:"#e6e6fa",lavenderblush:"#fff0f5",lawngreen:"#7cfc00",lemonchiffon:"#fffacd",lightblue:"#add8e6",lightcoral:"#f08080",lightcyan:"#e0ffff",lightgoldenrodyellow:"#fafad2",lightgray:"#d3d3d3",lightgreen:"#90ee90",lightgrey:"#d3d3d3",lightpink:"#ffb6c1",lightsalmon:"#ffa07a",lightseagreen:"#20b2aa",lightskyblue:"#87cefa",lightslategray:"#778899",lightslategrey:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",lime:"#00ff00",limegreen:"#32cd32",linen:"#faf0e6",magenta:"#ff00ff",maroon:"#800000",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370db",mediumseagreen:"#3cb371",mediumslateblue:"#7b68ee",mediumspringgreen:"#00fa9a",mediumturquoise:"#48d1cc",mediumvioletred:"#c71585",midnightblue:"#191970",mintcream:"#f5fffa",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",navajowhite:"#ffdead",navy:"#000080",oldlace:"#fdf5e6",olive:"#808000",olivedrab:"#6b8e23",orange:"#ffa500",orangered:"#ff4500",orchid:"#da70d6",palegoldenrod:"#eee8aa",palegreen:"#98fb98",paleturquoise:"#afeeee",palevioletred:"#db7093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",purple:"#800080",red:"#ff0000",rosybrown:"#bc8f8f",royalblue:"#4169e1",saddlebrown:"#8b4513",salmon:"#fa8072",sandybrown:"#f4a460",seagreen:"#2e8b57",seashell:"#fff5ee",sienna:"#a0522d",silver:"#c0c0c0",skyblue:"#87ceeb",slateblue:"#6a5acd",slategray:"#708090",slategrey:"#708090",snow:"#fffafa",springgreen:"#00ff7f",steelblue:"#4682b4",tan:"#d2b48c",teal:"#008080",thistle:"#d8bfd8",tomato:"#ff6347",turquoise:"#40e0d0",violet:"#ee82ee",wheat:"#f5deb3",white:"#ffffff",whitesmoke:"#f5f5f5",yellow:"#ffff00",yellowgreen:"#9acd32"};for(var Y in X)X[Y]=U(X[Y],R,_);d3.hsl=function(a,b,c){return arguments.length===1?a instanceof $?Z(a.h,a.s,a.l):U(""+a,V,Z):Z(+a,+b,+c)},$.prototype.brighter=function(a){return a=Math.pow(.7,arguments.length?a:1),Z(this.h,this.s,this.l/a)},$.prototype.darker=function(a){return a=Math.pow(.7,arguments.length?a:1),Z(this.h,this.s,a*this.l)},$.prototype.rgb=function(){return _(this.h,this.s,this.l)},$.prototype.toString=function(){return this.rgb().toString()};var bb=function(a,b){return b.querySelector(a)},bc=function(a,b){return b.querySelectorAll(a)};typeof Sizzle=="function"&&(bb=function(a,b){return Sizzle(a,b)[0]},bc=function(a,b){return Sizzle.uniqueSort(Sizzle(a,b))});var bd=[];d3.selection=function(){return bk},d3.selection.prototype=bd,bd.select=function(a){var b=[],c,d,e,f;typeof a!="function"&&(a=be(a));for(var g=-1,h=this.length;++g<h;){b.push(c=[]),c.parentNode=(e=this[g]).parentNode;for(var i=-1,j=e.length;++i<j;)(f=e[i])?(c.push(d=a.call(f,f.__data__,i)),d&&"__data__"in f&&(d.__data__=f.__data__)):c.push(null)}return ba(b)},bd.selectAll=function(a){var b=[],c,e;typeof a!="function"&&(a=bf(a));for(var f=-1,g=this.length;++f<g;)for(var h=this[f],i=-1,j=h.length;++i<j;)if(e=h[i])b.push(c=d(a.call(e,e.__data__,i))),c.parentNode=e;return ba(b)},bd.attr=function(a,b){function d(){this.removeAttribute(a)}function e(){this.removeAttributeNS(a.space,a.local)}function f(){this.setAttribute(a,b)}function g(){this.setAttributeNS(a.space,a.local,b)}function h(){var c=b.apply(this,arguments);c==null?this.removeAttribute(a):this.setAttribute(a,c)}function i(){var c=b.apply(this,arguments);c==null?this.removeAttributeNS(a.space,a.local):this.setAttributeNS(a.space,a.local,c)}a=d3.ns.qualify(a);if(arguments.length<2){var c=this.node();return a.local?c.getAttributeNS(a.space,a.local):c.getAttribute(a)}return this.each(b==null?a.local?e:d:typeof b=="function"?a.local?i:h:a.local?g:f)},bd.classed=function(a,b){var c=a.split(bg),d=c.length,e=-1;if(arguments.length>1){while(++e<d)bh.call(this,c[e],b);return this}while(++e<d)if(!bh.call(this,c[e]))return!1;return!0};var bg=/\s+/g;bd.style=function(a,b,c){function d(){this.style.removeProperty(a)}function e(){this.style.setProperty(a,b,c)}function f(){var d=b.apply(this,arguments);d==null?this.style.removeProperty(a):this.style.setProperty(a,d,c)}return arguments.length<3&&(c=""),arguments.length<2?window.getComputedStyle(this.node(),null).getPropertyValue(a):this.each(b==null?d:typeof b=="function"?f:e)},bd.property=function(a,b){function c(){delete this[a]}function d(){this[a]=b}function e(){var c=b.apply(this,arguments);c==null?delete this[a]:this[a]=c}return arguments.length<2?this.node()[a]:this.each(b==null?c:typeof b=="function"?e:d)},bd.text=function(a){return arguments.length<1?this.node().textContent:this.each(typeof a=="function"?function(){this.textContent=a.apply(this,arguments)}:function(){this.textContent=a})},bd.html=function(a){return arguments.length<1?this.node().innerHTML:this.each(typeof a=="function"?function(){this.innerHTML=a.apply(this,arguments)}:function(){this.innerHTML=a})},bd.append=function(a){function b(){return this.appendChild(document.createElement(a))}function c(){return this.appendChild(document.createElementNS(a.space,a.local))}return a=d3.ns.qualify(a),this.select(a.local?c:b)},bd.insert=function(a,b){function c(){return this.insertBefore(document.createElement(a),bb(b,this))}function d(){return this.insertBefore(document.createElementNS(a.space,a.local),bb(b,this))}return a=d3.ns.qualify(a),this.select(a.local?d:c)},bd.remove=function(){return this.each(function(){var a=this.parentNode;a&&a.removeChild(this)})},bd.data=function(a,b){function f(a,f){var g,h=a.length,i=f.length,j=Math.min(h,i),k=Math.max(h,i),l=[],m=[],n=[],o,p;if(b){var q={},r=[],s,t=f.length;for(g=-1;++g<h;)s=b.call(o=a[g],o.__data__,g),s in q?n[t++]=o:q[s]=o,r.push(s);for(g=-1;++g<i;)o=q[s=b.call(f,p=f[g],g)],o?(o.__data__=p,l[g]=o,m[g]=n[g]=null):(m[g]=bi(p),l[g]=n[g]=null),delete q[s];for(g=-1;++g<h;)r[g]in q&&(n[g]=a[g])}else{for(g=-1;++g<j;)o=a[g],p=f[g],o?(o.__data__=p,l[g]=o,m[g]=n[g]=null):(m[g]=bi(p),l[g]=n[g]=null);for(;g<i;++g)m[g]=bi(f[g]),l[g]=n[g]=null;for(;g<k;++g)n[g]=a[g],m[g]=l[g]=null}m.update=l,m.parentNode=l.parentNode=n.parentNode=a.parentNode,c.push(m),d.push(l),e.push(n)}var c=[],d=[],e=[],g=-1,h=this.length,i;if(typeof a=="function")while(++g<h)f(i=this[g],a.call(i,i.parentNode.__data__,g));else while(++g<h)f(i=this[g],a);var j=ba(d);return j.enter=function(){return bl(c)},j.exit=function(){return ba(e)},j},bd.filter=function(a){var b=[],c,d,e;for(var f=0,g=this.length;f<g;f++){b.push(c=[]),c.parentNode=(d=this[f]).parentNode;for(var h=0,i=d.length;h<i;h++)(e=d[h])&&a.call(e,e.__data__,h)&&c.push(e)}return ba(b)},bd.map=function(a){return this.each(function(){this.__data__=a.apply(this,arguments)})},bd.sort=function(a){a=bj.apply(this,arguments);for(var b=0,c=this.length;b<c;b++)for(var d=this[b].sort(a),e=1,f=d.length,g=d[0];e<f;e++){var h=d[e];h&&(g&&g.parentNode.insertBefore(h,g.nextSibling),g=h)}return this},bd.on=function(a,b,c){arguments.length<3&&(c=!1);var d="__on"+a,e=a.indexOf(".");return e>0&&(a=a.substring(0,e)),arguments.length<2?(e=this.node()[d])&&e._:this.each(function(e,f){function h(a){var c=d3.event;d3.event=a;try{b.call(g,g.__data__,f)}finally{d3.event=c}}var g=this;g[d]&&g.removeEventListener(a,g[d],c),b&&g.addEventListener(a,g[d]=h,c),h._=b})},bd.each=function(a){for(var b=-1,c=this.length;++b<c;)for(var d=this[b],e=-1,f=d.length;++e<f;){var g=d[e];g&&a.call(g,g.__data__,e,b)}return this},bd.call=function(a){return a.apply(this,(arguments[0]=this,arguments)),this},bd.empty=function(){return!this.node()},bd.node=function(a){for(var b=0,c=this.length;b<c;b++)for(var d=this[b],e=0,f=d.length;e<f;e++){var g=d[e];if(g)return g}return null},bd.transition=function(){var a=[],b,c;for(var d=-1,e=this.length;++d<e;){a.push(b=[]);for(var f=this[d],g=-1,h=f.length;++g<h;)b.push((c=f[g])?{node:c,delay:0,duration:250}:null)}return bn(a,bt||++bs,Date.now())};var bk=ba([[document]]);bk[0].parentNode=document.documentElement,d3.select=function(a){return typeof a=="string"?bk.select(a):ba([[a]])},d3.selectAll=function(a){return typeof a=="string"?bk.selectAll(a):ba([d(a)])};var bm=[];bm.append=bd.append,bm.insert=bd.insert,bm.empty=bd.empty,bm.node=bd.node,bm.select=function(a){var b=[],c,d,e,f,g;for(var h=-1,i=this.length;++h<i;){e=(f=this[h]).update,b.push(c=[]),c.parentNode=f.parentNode;for(var j=-1,k=f.length;++j<k;)(g=f[j])?(c.push(e[j]=d=a.call(f.parentNode,g.__data__,j)),d.__data__=g.__data__):c.push(null)}return ba(b)};var bo={},br=[],bs=0,bt=0,bu=d3.ease("cubic-in-out");br.call=bd.call,d3.transition=function(){return bk.transition()},d3.transition.prototype=br,br.select=function(a){var b=[],c,d,e;typeof a!="function"&&(a=be(a));for(var f=-1,g=this.length;++f<g;){b.push(c=[]);for(var h=this[f],i=-1,j=h.length;++i<j;)(e=h[i])&&(d=a.call(e.node,e.node.__data__,i))?("__data__"in e.node&&(d.__data__=e.node.__data__),c.push({node:d,delay:e.delay,duration:e.duration})):c.push(null)}return bn(b,this.id,this.time).ease(this.ease())},br.selectAll=function(a){var b=[],c,d,e;typeof a!="function"&&(a=bf(a));for(var f=-1,g=this.length;++f<g;)for(var h=this[f],i=-1,j=h.length;++i<j;)if(e=h[i]){d=a.call(e.node,e.node.__data__,i),b.push(c=[]);for(var k=-1,l=d.length;++k<l;)c.push({node:d[k],delay:e.delay,duration:e.duration})}return bn(b,this.id,this.time).ease(this.ease())},br.attr=function(a,b){return this.attrTween(a,bq(a,b))},br.attrTween=function(a,b){function d(a,d){var e=b.call(this,a,d,this.getAttribute(c));return e===bo?(this.removeAttribute(c),null):e&&function(a){this.setAttribute(c,e(a))}}function e(a,d){var e=b.call(this,a,d,this.getAttributeNS(c.space,c.local));return e===bo?(this.removeAttributeNS(c.space,c.local),null):e&&function(a){this.setAttributeNS(c.space,c.local,e(a))}}var c=d3.ns.qualify(a);return this.tween("attr."+a,c.local?e:d)},br.style=function(a,b,c){return arguments.length<3&&(c=""),this.styleTween(a,bq(a,b),c)},br.styleTween=function(a,b,c){return arguments.length<3&&(c=""),this.tween("style."+a,function(d,e){var f=b.call(this,d,e,window.getComputedStyle(this,null).getPropertyValue(a));return f===bo?(this.style.removeProperty(a),null):f&&function(b){this.style.setProperty(a,f(b),c)}})},br.text=function(a){return this.tween("text",function(b,c){this.textContent=typeof a=="function"?a.call(this,b,c):a})},br.remove=function(){return this.each("end",function(){var a;!this.__transition__&&(a=this.parentNode)&&a.removeChild(this)})},br.delay=function(a){var b=this;return b.each(typeof a=="function"?function(c,d,e){b[e][d].delay=+a.apply(this,arguments)}:(a=+a,function(c,d,e){b[e][d].delay=a}))},br.duration=function(a){var b=this;return b.each(typeof a=="function"?function(c,d,e){b[e][d].duration=+a.apply(this,arguments)}:(a=+a,function(c,d,e){b[e][d].duration=a}))},br.transition=function(){return this.select(i)};var bw=null,bx,by;d3.timer=function(a,b,c){var d=!1,e,f=bw;if(arguments.length<3){if(arguments.length<2)b=0;else if(!isFinite(b))return;c=Date.now()}while(f){if(f.callback===a){f.then=c,f.delay=b,d=!0;break}e=f,f=f.next}d||(bw={callback:a,then:c,delay:b,next:bw}),bx||(by=clearTimeout(by),bx=1,bB(bz))},d3.timer.flush=function(){var a,b=Date.now(),c=bw;while(c)a=b-c.then,c.delay||(c.flush=c.callback(a)),c=c.next;bA()};var bB=window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(a){setTimeout(a,17)};d3.transform=function(a){return bG.setAttribute("transform",a),new bC(bG.transform.baseVal.consolidate().matrix)},bC.prototype.toString=function(){return"translate("+this.translate+")rotate("+this.rotate+")skewX("+this.skew+")scale("+this.scale+")"};var bG=document.createElementNS(d3.ns.prefix.svg,"g"),bH=180/Math.PI;d3.scale={},d3.scale.linear=function(){return bM([0,1],[0,1],d3.interpolate,!1)},d3.scale.log=function(){return bU(d3.scale.linear(),bW)};var bV=d3.format("e");bW.pow=function(a){return Math.pow(10,a)},bX.pow=function(a){return-Math.pow(10,-a)},d3.scale.pow=function(){return bY(d3.scale.linear(),1)},d3.scale.sqrt=function(){return d3.scale.pow().exponent(.5)},d3.scale.ordinal=function(){return b$([],{t:"range",x:[]})},d3.scale.category10=function(){return d3.scale.ordinal().range(b_)},d3.scale.category20=function(){return d3.scale.ordinal().range(ca)},d3.scale.category20b=function(){return d3.scale.ordinal().range(cb)},d3.scale.category20c=function(){return d3.scale.ordinal().range(cc)};var b_=["#1f77b4","#ff7f0e","#2ca02c","#d62728","#9467bd","#8c564b","#e377c2","#7f7f7f","#bcbd22","#17becf"],ca=["#1f77b4","#aec7e8","#ff7f0e","#ffbb78","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5","#8c564b","#c49c94","#e377c2","#f7b6d2","#7f7f7f","#c7c7c7","#bcbd22","#dbdb8d","#17becf","#9edae5"],cb=["#393b79","#5254a3","#6b6ecf","#9c9ede","#637939","#8ca252","#b5cf6b","#cedb9c","#8c6d31","#bd9e39","#e7ba52","#e7cb94","#843c39","#ad494a","#d6616b","#e7969c","#7b4173","#a55194","#ce6dbd","#de9ed6"],cc=["#3182bd","#6baed6","#9ecae1","#c6dbef","#e6550d","#fd8d3c","#fdae6b","#fdd0a2","#31a354","#74c476","#a1d99b","#c7e9c0","#756bb1","#9e9ac8","#bcbddc","#dadaeb","#636363","#969696","#bdbdbd","#d9d9d9"];d3.scale.quantile=function(){return cd([],[])},d3.scale.quantize=function(){return ce(0,1,[0,1])},d3.svg={},d3.svg.arc=function(){function e(){var e=a.apply(this,arguments),f=b.apply(this,arguments),g=c.apply(this,arguments)+cf,h=d.apply(this,arguments)+cf,i=(h<g&&(i=g,g=h,h=i),h-g),j=i<Math.PI?"0":"1",k=Math.cos(g),l=Math.sin(g),m=Math.cos(h),n=Math.sin(h);return i>=cg?e?"M0,"+f+"A"+f+","+f+" 0 1,1 0,"+ -f+"A"+f+","+f+" 0 1,1 0,"+f+"M0,"+e+"A"+e+","+e+" 0 1,0 0,"+ -e+"A"+e+","+e+" 0 1,0 0,"+e+"Z":"M0,"+f+"A"+f+","+f+" 0 1,1 0,"+ -f+"A"+f+","+f+" 0 1,1 0,"+f+"Z":e?"M"+f*k+","+f*l+"A"+f+","+f+" 0 "+j+",1 "+f*m+","+f*n+"L"+e*m+","+e*n+"A"+e+","+e+" 0 "+j+",0 "+e*k+","+e*l+"Z":"M"+f*k+","+f*l+"A"+f+","+f+" 0 "+j+",1 "+f*m+","+f*n+"L0,0"+"Z"}var a=ch,b=ci,c=cj,d=ck;return e.innerRadius=function(b){return arguments.length?(a=d3.functor(b),e):a},e.outerRadius=function(a){return arguments.length?(b=d3.functor(a),e):b},e.startAngle=function(a){return arguments.length?(c=d3.functor(a),e):c},e.endAngle=function(a){return arguments.length?(d=d3.functor(a),e):d},e.centroid=function(){var e=(a.apply(this,arguments)+b.apply(this,arguments))/2,f=(c.apply(this,arguments)+d.apply(this,arguments))/2+cf;return[Math.cos(f)*e,Math.sin(f)*e]},e};var cf=-Math.PI/2,cg=2*Math.PI-1e-6;d3.svg.line=function(){return cl(Object)};var cp={linear:cq,"step-before":cr,"step-after":cs,basis:cy,"basis-open":cz,"basis-closed":cA,bundle:cB,cardinal:cv,"cardinal-open":ct,"cardinal-closed":cu,monotone:cK},cD=[0,2/3,1/3,0],cE=[0,1/3,2/3,0],cF=[0,1/6,2/3,1/6];d3.svg.line.radial=function(){var a=cl(cL);return a.radius=a.x,delete a.x,a.angle=a.y,delete a.y,a},cr.reverse=cs,cs.reverse=cr,d3.svg.area=function(){return cM(Object)},d3.svg.area.radial=function(){var a=cM(cL);return a.radius=a.x,delete a.x,a.innerRadius=a.x0,delete a.x0,a.outerRadius=a.x1,delete a.x1,a.angle=a.y,delete a.y,a.startAngle=a.y0,delete a.y0,a.endAngle=a.y1,delete a.y1,a},d3.svg.chord=function(){function f(c,d){var e=g(this,a,c,d),f=g(this,b,c,d);return"M"+e.p0+i(e.r,e.p1)+(h(e,f)?j(e.r,e.p1,e.r,e.p0):j(e.r,e.p1,f.r,f.p0)+i(f.r,f.p1)+j(f.r,f.p1,e.r,e.p0))+"Z"}function g(a,b,f,g){var h=b.call(a,f,g),i=c.call(a,h,g),j=d.call(a,h,g)+cf,k=e.call(a,h,g)+cf;return{r:i,a0:j,a1:k,p0:[i*Math.cos(j),i*Math.sin(j)],p1:[i*Math.cos(k),i*Math.sin(k)]}}function h(a,b){return a.a0==b.a0&&a.a1==b.a1}function i(a,b){return"A"+a+","+a+" 0 0,1 "+b}function j(a,b,c,d){return"Q 0,0 "+d}var a=cP,b=cQ,c=cR,d=cj,e=ck;return f.radius=function(a){return arguments.length?(c=d3.functor(a),f):c},f.source=function(b){return arguments.length?(a=d3.functor(b),f):a},f.target=function(a){return arguments.length?(b=d3.functor(a),f):b},f.startAngle=function(a){return arguments.length?(d=d3.functor(a),f):d},f.endAngle=function(a){return arguments.length?(e=d3.functor(a),f):e},f},d3.svg.diagonal=function(){function d(d,e){var f=a.call(this,d,e),g=b.call(this,d,e),h=(f.y+g.y)/2,i=[f,{x:f.x,y:h},{x:g.x,y:h},g];return i=i.map(c),"M"+i[0]+"C"+i[1]+" "+i[2]+" "+i[3]}var a=cP,b=cQ,c=cU;return d.source=function(b){return arguments.length?(a=d3.functor(b),d):a},d.target=function(a){return arguments.length?(b=d3.functor(a),d):b},d.projection=function(a){return arguments.length?(c=a,d):c},d},d3.svg.diagonal.radial=function(){var a=d3.svg.diagonal(),b=cU,c=a.projection;return a.projection=function(a){return arguments.length?c(cV(b=a)):b},a},d3.svg.mouse=function(a){return cX(a,d3.event)};var cW=/WebKit/.test(navigator.userAgent)?-1:0;d3.svg.touches=function(a,b){return arguments.length<2&&(b=d3.event.touches),b?d(b).map(function(b){var c=cX(a,b);return c.identifier=b.identifier,c}):[]},d3.svg.symbol=function(){function c(c,d){return(c$[a.call(this,c,d)]||c$.circle)(b.call(this,c,d))}var a=cZ,b=cY;return c.type=function(b){return arguments.length?(a=d3.functor(b),c):a},c.size=function(a){return arguments.length?(b=d3.functor(a),c):b},c};var c$={circle:function(a){var b=Math.sqrt(a/Math.PI);return"M0,"+b+"A"+b+","+b+" 0 1,1 0,"+ -b+"A"+b+","+b+" 0 1,1 0,"+b+"Z"},cross:function(a){var b=Math.sqrt(a/5)/2;return"M"+ -3*b+","+ -b+"H"+ -b+"V"+ -3*b+"H"+b+"V"+ -b+"H"+3*b+"V"+b+"H"+b+"V"+3*b+"H"+ -b+"V"+b+"H"+ -3*b+"Z"},diamond:function(a){var b=Math.sqrt(a/(2*da)),c=b*da;return"M0,"+ -b+"L"+c+",0"+" 0,"+b+" "+ -c+",0"+"Z"},square:function(a){var b=Math.sqrt(a)/2;return"M"+ -b+","+ -b+"L"+b+","+ -b+" "+b+","+b+" "+ -b+","+b+"Z"},"triangle-down":function(a){var b=Math.sqrt(a/c_),c=b*c_/2;return"M0,"+c+"L"+b+","+ -c+" "+ -b+","+ -c+"Z"},"triangle-up":function(a){var b=Math.sqrt(a/c_),c=b*c_/2;return"M0,"+ -c+"L"+b+","+c+" "+ -b+","+c+"Z"}};d3.svg.symbolTypes=d3.keys(c$);var c_=Math.sqrt(3),da=Math.tan(30*Math.PI/180);d3.svg.axis=function(){function j(j){j.each(function(k,l,m){var n=d3.select(this),o=j.delay?function(a){var b=bt;try{return bt=j.id,a.transition().delay(j[m][l].delay).duration(j[m][l].duration).ease(j.ease())}finally{bt=b}}:Object,p=a.ticks.apply(a,g),q=h==null?a.tickFormat.apply(a,g):h,r=dd(a,p,i),s=n.selectAll(".minor").data(r,String),t=s.enter().insert("svg:line","g").attr("class","tick minor").style("opacity",1e-6),u=o(s.exit()).style("opacity",1e-6).remove(),v=o(s).style("opacity",1),w=n.selectAll("g").data(p,String),x=w.enter().insert("svg:g","path").style("opacity",1e-6),y=o(w.exit()).style("opacity",1e-6).remove(),z=o(w).style("opacity",1),A,B=bJ(a.range()),C=n.selectAll(".domain").data([0]),D=C.enter().append("svg:path").attr("class","domain"),E=o(C),F=this.__chart__||a;this.__chart__=a.copy(),x.append("svg:line").attr("class","tick"),x.append("svg:text"),z.select("text").text(q);switch(b){case"bottom":A=db,v.attr("x2",0).attr("y2",d),z.select("line").attr("x2",0).attr("y2",c),z.select("text").attr("x",0).attr("y",Math.max(c,0)+f).attr("dy",".71em").attr("text-anchor","middle"),E.attr("d","M"+B[0]+","+e+"V0H"+B[1]+"V"+e);break;case"top":A=db,v.attr("x2",0).attr("y2",-d),z.select("line").attr("x2",0).attr("y2",-c),z.select("text").attr("x",0).attr("y",-(Math.max(c,0)+f)).attr("dy","0em").attr("text-anchor","middle"),E.attr("d","M"+B[0]+","+ -e+"V0H"+B[1]+"V"+ -e);break;case"left":A=dc,v.attr("x2",-d).attr("y2",0),z.select("line").attr("x2",-c).attr("y2",0),z.select("text").attr("x",-(Math.max(c,0)+f)).attr("y",0).attr("dy",".32em").attr("text-anchor","end"),E.attr("d","M"+ -e+","+B[0]+"H0V"+B[1]+"H"+ -e);break;case"right":A=dc,v.attr("x2",d).attr("y2",0),z.select("line").attr("x2",c).attr("y2",0),z.select("text").attr("x",Math.max(c,0)+f).attr("y",0).attr("dy",".32em").attr("text-anchor","start"),E.attr("d","M"+e+","+B[0]+"H0V"+B[1]+"H"+e)}x.call(A,F),z.call(A,a),y.call(A,a),t.call(A,F),v.call(A,a),u.call(A,a)})}var a=d3.scale.linear(),b="bottom",c=6,d=6,e=6,f=3,g=[10],h,i=0;return j.scale=function(b){return arguments.length?(a=b,j):a},j.orient=function(a){return arguments.length?(b=a,j):b},j.ticks=function(){return arguments.length?(g=arguments,j):g},j.tickFormat=function(a){return arguments.length?(h=a,j):h},j.tickSize=function(a,b,f){if(!arguments.length)return c;var g=arguments.length-1;return c=+a,d=g>1?+b:c,e=g>0?+arguments[g]:c,j},j.tickPadding=function(a){return arguments.length?(f=+a,j):f},j.tickSubdivide=function(a){return arguments.length?(i=+a,j):i},j},d3.svg.brush=function(){function e(a){var g=b&&c?["n","e","s","w","nw","ne","se","sw"]:b?["e","w"]:c?["n","s"]:[];a.each(function(){var a=d3.select(this).on("mousedown.brush",f),h=a.selectAll(".background").data([,]),i=a.selectAll(".extent").data([,]),j=a.selectAll(".resize").data(g,String),k;h.enter().append("svg:rect").attr("class","background").style("visibility","hidden").style("pointer-events","all").style("cursor","crosshair"),i.enter().append("svg:rect").attr("class","extent").style("cursor","move"),j.enter().append("svg:rect").attr("class",function(a){return"resize "+a}).attr("width",6).attr("height",6).style("visibility","hidden").style("pointer-events",e.empty()?"none":"all").style("cursor",function(a){return dw[a]}),j.exit().remove(),b&&(k=bJ(b.range()),h.attr("x",k[0]).attr("width",k[1]-k[0]),dp(a,d)),c&&(k=bJ(c.range()),h.attr("y",k[0]).attr("height",k[1]-k[0]),dq(a,d))})}function f(){var a=d3.select(d3.event.target);de=e,dg=this,dj=d,dn=d3.svg.mouse(dg),(dk=a.classed("extent"))?(dn[0]=d[0][0]-dn[0],dn[1]=d[0][1]-dn[1]):a.classed("resize")?(dl=d3.event.target.__data__,dn[0]=d[+/w$/.test(dl)][0],dn[1]=d[+/^n/.test(dl)][1]):d3.event.altKey&&(dm=dn.slice()),dh=!/^(n|s)$/.test(dl)&&b,di=!/^(e|w)$/.test(dl)&&c,df=g(this,arguments),df("brushstart"),dt(),M()}function g(b,c){return function(d){var f=d3.event;try{d3.event={type:d,target:e},a[d].apply(b,c)}finally{d3.event=f}}}var a=d3.dispatch("brushstart","brush","brushend"),b,c,d=[[0,0],[0,0]];return e.x=function(a){return arguments.length?(b=a,e):b},e.y=function(a){return arguments.length?(c=a,e):c},e.extent=function(a){var f,g,h,i,j;return arguments.length?(b&&(f=a[0],g=a[1],c&&(f=f[0],g=g[0]),f=b(f),g=b(g),g<f&&(j=f,f=g,g=j),d[0][0]=f,d[1][0]=g),c&&(h=a[0],i=a[1],b&&(h=h[1],i=i[1]),h=c(h),i=c(i),i<h&&(j=h,h=i,i=j),d[0][1]=h,d[1][1]=i),e):(b&&(f=b.invert(d[0][0]),g=b.invert(d[1][0]),g<f&&(j=f,f=g,g=j)),c&&(h=c.invert(d[0][1]),i=c.invert(d[1][1]),i<h&&(j=h,h=i,i=j)),b&&c?[[f,h],[g,i]]:b?[f,g]:c&&[h,i])},e.clear=function(){return d[0][0]=d[0][1]=d[1][0]=d[1][1]=0,e},e.empty=function(){return b&&d[0][0]===d[1][0]||c&&d[0][1]===d[1][1]},e.on=function(b,c){return a.on(b,c),e},d3.select(window).on("mousemove.brush",dt).on("mouseup.brush",dv).on("keydown.brush",dr).on("keyup.brush",ds),e};var de,df,dg,dh,di,dj,dk,dl,dm,dn,dw={n:"ns-resize",e:"ew-resize",s:"ns-resize",w:"ew-resize",nw:"nwse-resize",ne:"nesw-resize",se:"nwse-resize",sw:"nesw-resize"};d3.behavior={},d3.behavior.drag=function(){function b(){this.on("mousedown.drag",d).on("touchstart.drag",d),d3.select(window).on("mousemove.drag",dG).on("touchmove.drag",dG).on("mouseup.drag",dH,!0).on("touchend.drag",dH,!0).on("click.drag",dI,!0)}function c(){dx=a,dy=d3.event.target,dB=dF((dz=this).parentNode),dC=0,dA=arguments}function d(){c.apply(this,arguments),dE("dragstart")}var a=d3.dispatch("drag","dragstart","dragend");return b.on=function(c,d){return a.on(c,d),b},b};var dx,dy,dz,dA,dB,dC,dD;d3.behavior.zoom=function(){function d(){this.on("mousedown.zoom",f).on("mousewheel.zoom",g).on("DOMMouseScroll.zoom",g).on("dblclick.zoom",h).on("touchstart.zoom",i),d3.select(window).on("mousemove.zoom",d$).on("mouseup.zoom",d_).on("touchmove.zoom",dZ).on("touchend.zoom",dY).on("click.zoom",ea,!0)}function e(){dO=a,dP=c,dQ=b.zoom,dR=d3.event.target,dS=this,dT=arguments}function f(){e.apply(this,arguments),dK=dW(d3.svg.mouse(dS)),dU=!1,d3.event.preventDefault(),window.focus()}function g(){e.apply(this,arguments),dL||(dL=dW(d3.svg.mouse(dS))),eb(dX()+a[2],d3.svg.mouse(dS),dL)}function h(){e.apply(this,arguments);var b=d3.svg.mouse(dS);eb(d3.event.shiftKey?Math.ceil(a[2]-1):Math.floor(a[2]+1),b,dW(b))}function i(){e.apply(this,arguments);var b=dY(),c,d=Date.now();b.length===1&&d-dN<300&&eb(1+Math.floor(a[2]),c=b[0],dM[c.identifier]),dN=d}var a=[0,0,0],b=d3.dispatch("zoom"),c=ec;return d.extent=function(a){return arguments.length?(c=a==null?ec:a,d):c},d.on=function(a,c){return b.on(a,c),d},d};var dJ,dK,dL,dM={},dN=0,dO,dP,dQ,dR,dS,dT,dU,dV,ec=[[-Infinity,Infinity],[-Infinity,Infinity],[-Infinity,Infinity]]})();��������������������������������������������������������������������������������������������������������������������rickshaw-1.4.6/vendor/d3.v2.js����������������������������������������������������������������������0000664�0000000�0000000�00000724072�12251233401�0016031�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������(function() {
      function d3_class(ctor, properties) {
        try {
          for (var key in properties) {
            Object.defineProperty(ctor.prototype, key, {
              value: properties[key],
              enumerable: false
            });
          }
        } catch (e) {
          ctor.prototype = properties;
        }
      }
      function d3_arrayCopy(pseudoarray) {
        var i = -1, n = pseudoarray.length, array = [];
        while (++i < n) array.push(pseudoarray[i]);
        return array;
      }
      function d3_arraySlice(pseudoarray) {
        return Array.prototype.slice.call(pseudoarray);
      }
      function d3_Map() {}
      function d3_identity(d) {
        return d;
      }
      function d3_this() {
        return this;
      }
      function d3_true() {
        return true;
      }
      function d3_functor(v) {
        return typeof v === "function" ? v : function() {
          return v;
        };
      }
      function d3_rebind(target, source, method) {
        return function() {
          var value = method.apply(source, arguments);
          return arguments.length ? target : value;
        };
      }
      function d3_number(x) {
        return x != null && !isNaN(x);
      }
      function d3_zipLength(d) {
        return d.length;
      }
      function d3_splitter(d) {
        return d == null;
      }
      function d3_collapse(s) {
        return s.trim().replace(/\s+/g, " ");
      }
      function d3_range_integerScale(x) {
        var k = 1;
        while (x * k % 1) k *= 10;
        return k;
      }
      function d3_dispatch() {}
      function d3_dispatch_event(dispatch) {
        function event() {
          var z = listeners, i = -1, n = z.length, l;
          while (++i < n) if (l = z[i].on) l.apply(this, arguments);
          return dispatch;
        }
        var listeners = [], listenerByName = new d3_Map;
        event.on = function(name, listener) {
          var l = listenerByName.get(name), i;
          if (arguments.length < 2) return l && l.on;
          if (l) {
            l.on = null;
            listeners = listeners.slice(0, i = listeners.indexOf(l)).concat(listeners.slice(i + 1));
            listenerByName.remove(name);
          }
          if (listener) listeners.push(listenerByName.set(name, {
            on: listener
          }));
          return dispatch;
        };
        return event;
      }
      function d3_format_precision(x, p) {
        return p - (x ? 1 + Math.floor(Math.log(x + Math.pow(10, 1 + Math.floor(Math.log(x) / Math.LN10) - p)) / Math.LN10) : 1);
      }
      function d3_format_typeDefault(x) {
        return x + "";
      }
      function d3_format_group(value) {
        var i = value.lastIndexOf("."), f = i >= 0 ? value.substring(i) : (i = value.length, ""), t = [];
        while (i > 0) t.push(value.substring(i -= 3, i + 3));
        return t.reverse().join(",") + f;
      }
      function d3_formatPrefix(d, i) {
        var k = Math.pow(10, Math.abs(8 - i) * 3);
        return {
          scale: i > 8 ? function(d) {
            return d / k;
          } : function(d) {
            return d * k;
          },
          symbol: d
        };
      }
      function d3_ease_clamp(f) {
        return function(t) {
          return t <= 0 ? 0 : t >= 1 ? 1 : f(t);
        };
      }
      function d3_ease_reverse(f) {
        return function(t) {
          return 1 - f(1 - t);
        };
      }
      function d3_ease_reflect(f) {
        return function(t) {
          return .5 * (t < .5 ? f(2 * t) : 2 - f(2 - 2 * t));
        };
      }
      function d3_ease_identity(t) {
        return t;
      }
      function d3_ease_poly(e) {
        return function(t) {
          return Math.pow(t, e);
        };
      }
      function d3_ease_sin(t) {
        return 1 - Math.cos(t * Math.PI / 2);
      }
      function d3_ease_exp(t) {
        return Math.pow(2, 10 * (t - 1));
      }
      function d3_ease_circle(t) {
        return 1 - Math.sqrt(1 - t * t);
      }
      function d3_ease_elastic(a, p) {
        var s;
        if (arguments.length < 2) p = .45;
        if (arguments.length < 1) {
          a = 1;
          s = p / 4;
        } else s = p / (2 * Math.PI) * Math.asin(1 / a);
        return function(t) {
          return 1 + a * Math.pow(2, 10 * -t) * Math.sin((t - s) * 2 * Math.PI / p);
        };
      }
      function d3_ease_back(s) {
        if (!s) s = 1.70158;
        return function(t) {
          return t * t * ((s + 1) * t - s);
        };
      }
      function d3_ease_bounce(t) {
        return t < 1 / 2.75 ? 7.5625 * t * t : t < 2 / 2.75 ? 7.5625 * (t -= 1.5 / 2.75) * t + .75 : t < 2.5 / 2.75 ? 7.5625 * (t -= 2.25 / 2.75) * t + .9375 : 7.5625 * (t -= 2.625 / 2.75) * t + .984375;
      }
      function d3_eventCancel() {
        d3.event.stopPropagation();
        d3.event.preventDefault();
      }
      function d3_eventSource() {
        var e = d3.event, s;
        while (s = e.sourceEvent) e = s;
        return e;
      }
      function d3_eventDispatch(target) {
        var dispatch = new d3_dispatch, i = 0, n = arguments.length;
        while (++i < n) dispatch[arguments[i]] = d3_dispatch_event(dispatch);
        dispatch.of = function(thiz, argumentz) {
          return function(e1) {
            try {
              var e0 = e1.sourceEvent = d3.event;
              e1.target = target;
              d3.event = e1;
              dispatch[e1.type].apply(thiz, argumentz);
            } finally {
              d3.event = e0;
            }
          };
        };
        return dispatch;
      }
      function d3_transform(m) {
        var r0 = [ m.a, m.b ], r1 = [ m.c, m.d ], kx = d3_transformNormalize(r0), kz = d3_transformDot(r0, r1), ky = d3_transformNormalize(d3_transformCombine(r1, r0, -kz)) || 0;
        if (r0[0] * r1[1] < r1[0] * r0[1]) {
          r0[0] *= -1;
          r0[1] *= -1;
          kx *= -1;
          kz *= -1;
        }
        this.rotate = (kx ? Math.atan2(r0[1], r0[0]) : Math.atan2(-r1[0], r1[1])) * d3_transformDegrees;
        this.translate = [ m.e, m.f ];
        this.scale = [ kx, ky ];
        this.skew = ky ? Math.atan2(kz, ky) * d3_transformDegrees : 0;
      }
      function d3_transformDot(a, b) {
        return a[0] * b[0] + a[1] * b[1];
      }
      function d3_transformNormalize(a) {
        var k = Math.sqrt(d3_transformDot(a, a));
        if (k) {
          a[0] /= k;
          a[1] /= k;
        }
        return k;
      }
      function d3_transformCombine(a, b, k) {
        a[0] += k * b[0];
        a[1] += k * b[1];
        return a;
      }
      function d3_interpolateByName(name) {
        return name == "transform" ? d3.interpolateTransform : d3.interpolate;
      }
      function d3_uninterpolateNumber(a, b) {
        b = b - (a = +a) ? 1 / (b - a) : 0;
        return function(x) {
          return (x - a) * b;
        };
      }
      function d3_uninterpolateClamp(a, b) {
        b = b - (a = +a) ? 1 / (b - a) : 0;
        return function(x) {
          return Math.max(0, Math.min(1, (x - a) * b));
        };
      }
      function d3_Color() {}
      function d3_rgb(r, g, b) {
        return new d3_Rgb(r, g, b);
      }
      function d3_Rgb(r, g, b) {
        this.r = r;
        this.g = g;
        this.b = b;
      }
      function d3_rgb_hex(v) {
        return v < 16 ? "0" + Math.max(0, v).toString(16) : Math.min(255, v).toString(16);
      }
      function d3_rgb_parse(format, rgb, hsl) {
        var r = 0, g = 0, b = 0, m1, m2, name;
        m1 = /([a-z]+)\((.*)\)/i.exec(format);
        if (m1) {
          m2 = m1[2].split(",");
          switch (m1[1]) {
           case "hsl":
            {
              return hsl(parseFloat(m2[0]), parseFloat(m2[1]) / 100, parseFloat(m2[2]) / 100);
            }
           case "rgb":
            {
              return rgb(d3_rgb_parseNumber(m2[0]), d3_rgb_parseNumber(m2[1]), d3_rgb_parseNumber(m2[2]));
            }
          }
        }
        if (name = d3_rgb_names.get(format)) return rgb(name.r, name.g, name.b);
        if (format != null && format.charAt(0) === "#") {
          if (format.length === 4) {
            r = format.charAt(1);
            r += r;
            g = format.charAt(2);
            g += g;
            b = format.charAt(3);
            b += b;
          } else if (format.length === 7) {
            r = format.substring(1, 3);
            g = format.substring(3, 5);
            b = format.substring(5, 7);
          }
          r = parseInt(r, 16);
          g = parseInt(g, 16);
          b = parseInt(b, 16);
        }
        return rgb(r, g, b);
      }
      function d3_rgb_hsl(r, g, b) {
        var min = Math.min(r /= 255, g /= 255, b /= 255), max = Math.max(r, g, b), d = max - min, h, s, l = (max + min) / 2;
        if (d) {
          s = l < .5 ? d / (max + min) : d / (2 - max - min);
          if (r == max) h = (g - b) / d + (g < b ? 6 : 0); else if (g == max) h = (b - r) / d + 2; else h = (r - g) / d + 4;
          h *= 60;
        } else {
          s = h = 0;
        }
        return d3_hsl(h, s, l);
      }
      function d3_rgb_lab(r, g, b) {
        r = d3_rgb_xyz(r);
        g = d3_rgb_xyz(g);
        b = d3_rgb_xyz(b);
        var x = d3_xyz_lab((.4124564 * r + .3575761 * g + .1804375 * b) / d3_lab_X), y = d3_xyz_lab((.2126729 * r + .7151522 * g + .072175 * b) / d3_lab_Y), z = d3_xyz_lab((.0193339 * r + .119192 * g + .9503041 * b) / d3_lab_Z);
        return d3_lab(116 * y - 16, 500 * (x - y), 200 * (y - z));
      }
      function d3_rgb_xyz(r) {
        return (r /= 255) <= .04045 ? r / 12.92 : Math.pow((r + .055) / 1.055, 2.4);
      }
      function d3_rgb_parseNumber(c) {
        var f = parseFloat(c);
        return c.charAt(c.length - 1) === "%" ? Math.round(f * 2.55) : f;
      }
      function d3_hsl(h, s, l) {
        return new d3_Hsl(h, s, l);
      }
      function d3_Hsl(h, s, l) {
        this.h = h;
        this.s = s;
        this.l = l;
      }
      function d3_hsl_rgb(h, s, l) {
        function v(h) {
          if (h > 360) h -= 360; else if (h < 0) h += 360;
          if (h < 60) return m1 + (m2 - m1) * h / 60;
          if (h < 180) return m2;
          if (h < 240) return m1 + (m2 - m1) * (240 - h) / 60;
          return m1;
        }
        function vv(h) {
          return Math.round(v(h) * 255);
        }
        var m1, m2;
        h = h % 360;
        if (h < 0) h += 360;
        s = s < 0 ? 0 : s > 1 ? 1 : s;
        l = l < 0 ? 0 : l > 1 ? 1 : l;
        m2 = l <= .5 ? l * (1 + s) : l + s - l * s;
        m1 = 2 * l - m2;
        return d3_rgb(vv(h + 120), vv(h), vv(h - 120));
      }
      function d3_hcl(h, c, l) {
        return new d3_Hcl(h, c, l);
      }
      function d3_Hcl(h, c, l) {
        this.h = h;
        this.c = c;
        this.l = l;
      }
      function d3_hcl_lab(h, c, l) {
        return d3_lab(l, Math.cos(h *= Math.PI / 180) * c, Math.sin(h) * c);
      }
      function d3_lab(l, a, b) {
        return new d3_Lab(l, a, b);
      }
      function d3_Lab(l, a, b) {
        this.l = l;
        this.a = a;
        this.b = b;
      }
      function d3_lab_rgb(l, a, b) {
        var y = (l + 16) / 116, x = y + a / 500, z = y - b / 200;
        x = d3_lab_xyz(x) * d3_lab_X;
        y = d3_lab_xyz(y) * d3_lab_Y;
        z = d3_lab_xyz(z) * d3_lab_Z;
        return d3_rgb(d3_xyz_rgb(3.2404542 * x - 1.5371385 * y - .4985314 * z), d3_xyz_rgb(-.969266 * x + 1.8760108 * y + .041556 * z), d3_xyz_rgb(.0556434 * x - .2040259 * y + 1.0572252 * z));
      }
      function d3_lab_hcl(l, a, b) {
        return d3_hcl(Math.atan2(b, a) / Math.PI * 180, Math.sqrt(a * a + b * b), l);
      }
      function d3_lab_xyz(x) {
        return x > .206893034 ? x * x * x : (x - 4 / 29) / 7.787037;
      }
      function d3_xyz_lab(x) {
        return x > .008856 ? Math.pow(x, 1 / 3) : 7.787037 * x + 4 / 29;
      }
      function d3_xyz_rgb(r) {
        return Math.round(255 * (r <= .00304 ? 12.92 * r : 1.055 * Math.pow(r, 1 / 2.4) - .055));
      }
      function d3_selection(groups) {
        d3_arraySubclass(groups, d3_selectionPrototype);
        return groups;
      }
      function d3_selection_selector(selector) {
        return function() {
          return d3_select(selector, this);
        };
      }
      function d3_selection_selectorAll(selector) {
        return function() {
          return d3_selectAll(selector, this);
        };
      }
      function d3_selection_attr(name, value) {
        function attrNull() {
          this.removeAttribute(name);
        }
        function attrNullNS() {
          this.removeAttributeNS(name.space, name.local);
        }
        function attrConstant() {
          this.setAttribute(name, value);
        }
        function attrConstantNS() {
          this.setAttributeNS(name.space, name.local, value);
        }
        function attrFunction() {
          var x = value.apply(this, arguments);
          if (x == null) this.removeAttribute(name); else this.setAttribute(name, x);
        }
        function attrFunctionNS() {
          var x = value.apply(this, arguments);
          if (x == null) this.removeAttributeNS(name.space, name.local); else this.setAttributeNS(name.space, name.local, x);
        }
        name = d3.ns.qualify(name);
        return value == null ? name.local ? attrNullNS : attrNull : typeof value === "function" ? name.local ? attrFunctionNS : attrFunction : name.local ? attrConstantNS : attrConstant;
      }
      function d3_selection_classedRe(name) {
        return new RegExp("(?:^|\\s+)" + d3.requote(name) + "(?:\\s+|$)", "g");
      }
      function d3_selection_classed(name, value) {
        function classedConstant() {
          var i = -1;
          while (++i < n) name[i](this, value);
        }
        function classedFunction() {
          var i = -1, x = value.apply(this, arguments);
          while (++i < n) name[i](this, x);
        }
        name = name.trim().split(/\s+/).map(d3_selection_classedName);
        var n = name.length;
        return typeof value === "function" ? classedFunction : classedConstant;
      }
      function d3_selection_classedName(name) {
        var re = d3_selection_classedRe(name);
        return function(node, value) {
          if (c = node.classList) return value ? c.add(name) : c.remove(name);
          var c = node.className, cb = c.baseVal != null, cv = cb ? c.baseVal : c;
          if (value) {
            re.lastIndex = 0;
            if (!re.test(cv)) {
              cv = d3_collapse(cv + " " + name);
              if (cb) c.baseVal = cv; else node.className = cv;
            }
          } else if (cv) {
            cv = d3_collapse(cv.replace(re, " "));
            if (cb) c.baseVal = cv; else node.className = cv;
          }
        };
      }
      function d3_selection_style(name, value, priority) {
        function styleNull() {
          this.style.removeProperty(name);
        }
        function styleConstant() {
          this.style.setProperty(name, value, priority);
        }
        function styleFunction() {
          var x = value.apply(this, arguments);
          if (x == null) this.style.removeProperty(name); else this.style.setProperty(name, x, priority);
        }
        return value == null ? styleNull : typeof value === "function" ? styleFunction : styleConstant;
      }
      function d3_selection_property(name, value) {
        function propertyNull() {
          delete this[name];
        }
        function propertyConstant() {
          this[name] = value;
        }
        function propertyFunction() {
          var x = value.apply(this, arguments);
          if (x == null) delete this[name]; else this[name] = x;
        }
        return value == null ? propertyNull : typeof value === "function" ? propertyFunction : propertyConstant;
      }
      function d3_selection_dataNode(data) {
        return {
          __data__: data
        };
      }
      function d3_selection_filter(selector) {
        return function() {
          return d3_selectMatches(this, selector);
        };
      }
      function d3_selection_sortComparator(comparator) {
        if (!arguments.length) comparator = d3.ascending;
        return function(a, b) {
          return comparator(a && a.__data__, b && b.__data__);
        };
      }
      function d3_selection_on(type, listener, capture) {
        function onRemove() {
          var wrapper = this[name];
          if (wrapper) {
            this.removeEventListener(type, wrapper, wrapper.$);
            delete this[name];
          }
        }
        function onAdd() {
          function wrapper(e) {
            var o = d3.event;
            d3.event = e;
            args[0] = node.__data__;
            try {
              listener.apply(node, args);
            } finally {
              d3.event = o;
            }
          }
          var node = this, args = arguments;
          onRemove.call(this);
          this.addEventListener(type, this[name] = wrapper, wrapper.$ = capture);
          wrapper._ = listener;
        }
        var name = "__on" + type, i = type.indexOf(".");
        if (i > 0) type = type.substring(0, i);
        return listener ? onAdd : onRemove;
      }
      function d3_selection_each(groups, callback) {
        for (var j = 0, m = groups.length; j < m; j++) {
          for (var group = groups[j], i = 0, n = group.length, node; i < n; i++) {
            if (node = group[i]) callback(node, i, j);
          }
        }
        return groups;
      }
      function d3_selection_enter(selection) {
        d3_arraySubclass(selection, d3_selection_enterPrototype);
        return selection;
      }
      function d3_transition(groups, id, time) {
        d3_arraySubclass(groups, d3_transitionPrototype);
        var tweens = new d3_Map, event = d3.dispatch("start", "end"), ease = d3_transitionEase;
        groups.id = id;
        groups.time = time;
        groups.tween = function(name, tween) {
          if (arguments.length < 2) return tweens.get(name);
          if (tween == null) tweens.remove(name); else tweens.set(name, tween);
          return groups;
        };
        groups.ease = function(value) {
          if (!arguments.length) return ease;
          ease = typeof value === "function" ? value : d3.ease.apply(d3, arguments);
          return groups;
        };
        groups.each = function(type, listener) {
          if (arguments.length < 2) return d3_transition_each.call(groups, type);
          event.on(type, listener);
          return groups;
        };
        d3.timer(function(elapsed) {
          return d3_selection_each(groups, function(node, i, j) {
            function start(elapsed) {
              if (lock.active > id) return stop();
              lock.active = id;
              tweens.forEach(function(key, value) {
                if (value = value.call(node, d, i)) {
                  tweened.push(value);
                }
              });
              event.start.call(node, d, i);
              if (!tick(elapsed)) d3.timer(tick, 0, time);
              return 1;
            }
            function tick(elapsed) {
              if (lock.active !== id) return stop();
              var t = (elapsed - delay) / duration, e = ease(t), n = tweened.length;
              while (n > 0) {
                tweened[--n].call(node, e);
              }
              if (t >= 1) {
                stop();
                d3_transitionId = id;
                event.end.call(node, d, i);
                d3_transitionId = 0;
                return 1;
              }
            }
            function stop() {
              if (!--lock.count) delete node.__transition__;
              return 1;
            }
            var tweened = [], delay = node.delay, duration = node.duration, lock = (node = node.node).__transition__ || (node.__transition__ = {
              active: 0,
              count: 0
            }), d = node.__data__;
            ++lock.count;
            delay <= elapsed ? start(elapsed) : d3.timer(start, delay, time);
          });
        }, 0, time);
        return groups;
      }
      function d3_transition_each(callback) {
        var id = d3_transitionId, ease = d3_transitionEase, delay = d3_transitionDelay, duration = d3_transitionDuration;
        d3_transitionId = this.id;
        d3_transitionEase = this.ease();
        d3_selection_each(this, function(node, i, j) {
          d3_transitionDelay = node.delay;
          d3_transitionDuration = node.duration;
          callback.call(node = node.node, node.__data__, i, j);
        });
        d3_transitionId = id;
        d3_transitionEase = ease;
        d3_transitionDelay = delay;
        d3_transitionDuration = duration;
        return this;
      }
      function d3_tweenNull(d, i, a) {
        return a != "" && d3_tweenRemove;
      }
      function d3_tweenByName(b, name) {
        return d3.tween(b, d3_interpolateByName(name));
      }
      function d3_timer_step() {
        var elapsed, now = Date.now(), t1 = d3_timer_queue;
        while (t1) {
          elapsed = now - t1.then;
          if (elapsed >= t1.delay) t1.flush = t1.callback(elapsed);
          t1 = t1.next;
        }
        var delay = d3_timer_flush() - now;
        if (delay > 24) {
          if (isFinite(delay)) {
            clearTimeout(d3_timer_timeout);
            d3_timer_timeout = setTimeout(d3_timer_step, delay);
          }
          d3_timer_interval = 0;
        } else {
          d3_timer_interval = 1;
          d3_timer_frame(d3_timer_step);
        }
      }
      function d3_timer_flush() {
        var t0 = null, t1 = d3_timer_queue, then = Infinity;
        while (t1) {
          if (t1.flush) {
            delete d3_timer_byId[t1.callback.id];
            t1 = t0 ? t0.next = t1.next : d3_timer_queue = t1.next;
          } else {
            then = Math.min(then, t1.then + t1.delay);
            t1 = (t0 = t1).next;
          }
        }
        return then;
      }
      function d3_mousePoint(container, e) {
        var svg = container.ownerSVGElement || container;
        if (svg.createSVGPoint) {
          var point = svg.createSVGPoint();
          if (d3_mouse_bug44083 < 0 && (window.scrollX || window.scrollY)) {
            svg = d3.select(document.body).append("svg").style("position", "absolute").style("top", 0).style("left", 0);
            var ctm = svg[0][0].getScreenCTM();
            d3_mouse_bug44083 = !(ctm.f || ctm.e);
            svg.remove();
          }
          if (d3_mouse_bug44083) {
            point.x = e.pageX;
            point.y = e.pageY;
          } else {
            point.x = e.clientX;
            point.y = e.clientY;
          }
          point = point.matrixTransform(container.getScreenCTM().inverse());
          return [ point.x, point.y ];
        }
        var rect = container.getBoundingClientRect();
        return [ e.clientX - rect.left - container.clientLeft, e.clientY - rect.top - container.clientTop ];
      }
      function d3_noop() {}
      function d3_scaleExtent(domain) {
        var start = domain[0], stop = domain[domain.length - 1];
        return start < stop ? [ start, stop ] : [ stop, start ];
      }
      function d3_scaleRange(scale) {
        return scale.rangeExtent ? scale.rangeExtent() : d3_scaleExtent(scale.range());
      }
      function d3_scale_nice(domain, nice) {
        var i0 = 0, i1 = domain.length - 1, x0 = domain[i0], x1 = domain[i1], dx;
        if (x1 < x0) {
          dx = i0, i0 = i1, i1 = dx;
          dx = x0, x0 = x1, x1 = dx;
        }
        if (nice = nice(x1 - x0)) {
          domain[i0] = nice.floor(x0);
          domain[i1] = nice.ceil(x1);
        }
        return domain;
      }
      function d3_scale_niceDefault() {
        return Math;
      }
      function d3_scale_linear(domain, range, interpolate, clamp) {
        function rescale() {
          var linear = Math.min(domain.length, range.length) > 2 ? d3_scale_polylinear : d3_scale_bilinear, uninterpolate = clamp ? d3_uninterpolateClamp : d3_uninterpolateNumber;
          output = linear(domain, range, uninterpolate, interpolate);
          input = linear(range, domain, uninterpolate, d3.interpolate);
          return scale;
        }
        function scale(x) {
          return output(x);
        }
        var output, input;
        scale.invert = function(y) {
          return input(y);
        };
        scale.domain = function(x) {
          if (!arguments.length) return domain;
          domain = x.map(Number);
          return rescale();
        };
        scale.range = function(x) {
          if (!arguments.length) return range;
          range = x;
          return rescale();
        };
        scale.rangeRound = function(x) {
          return scale.range(x).interpolate(d3.interpolateRound);
        };
        scale.clamp = function(x) {
          if (!arguments.length) return clamp;
          clamp = x;
          return rescale();
        };
        scale.interpolate = function(x) {
          if (!arguments.length) return interpolate;
          interpolate = x;
          return rescale();
        };
        scale.ticks = function(m) {
          return d3_scale_linearTicks(domain, m);
        };
        scale.tickFormat = function(m) {
          return d3_scale_linearTickFormat(domain, m);
        };
        scale.nice = function() {
          d3_scale_nice(domain, d3_scale_linearNice);
          return rescale();
        };
        scale.copy = function() {
          return d3_scale_linear(domain, range, interpolate, clamp);
        };
        return rescale();
      }
      function d3_scale_linearRebind(scale, linear) {
        return d3.rebind(scale, linear, "range", "rangeRound", "interpolate", "clamp");
      }
      function d3_scale_linearNice(dx) {
        dx = Math.pow(10, Math.round(Math.log(dx) / Math.LN10) - 1);
        return dx && {
          floor: function(x) {
            return Math.floor(x / dx) * dx;
          },
          ceil: function(x) {
            return Math.ceil(x / dx) * dx;
          }
        };
      }
      function d3_scale_linearTickRange(domain, m) {
        var extent = d3_scaleExtent(domain), span = extent[1] - extent[0], step = Math.pow(10, Math.floor(Math.log(span / m) / Math.LN10)), err = m / span * step;
        if (err <= .15) step *= 10; else if (err <= .35) step *= 5; else if (err <= .75) step *= 2;
        extent[0] = Math.ceil(extent[0] / step) * step;
        extent[1] = Math.floor(extent[1] / step) * step + step * .5;
        extent[2] = step;
        return extent;
      }
      function d3_scale_linearTicks(domain, m) {
        return d3.range.apply(d3, d3_scale_linearTickRange(domain, m));
      }
      function d3_scale_linearTickFormat(domain, m) {
        return d3.format(",." + Math.max(0, -Math.floor(Math.log(d3_scale_linearTickRange(domain, m)[2]) / Math.LN10 + .01)) + "f");
      }
      function d3_scale_bilinear(domain, range, uninterpolate, interpolate) {
        var u = uninterpolate(domain[0], domain[1]), i = interpolate(range[0], range[1]);
        return function(x) {
          return i(u(x));
        };
      }
      function d3_scale_polylinear(domain, range, uninterpolate, interpolate) {
        var u = [], i = [], j = 0, k = Math.min(domain.length, range.length) - 1;
        if (domain[k] < domain[0]) {
          domain = domain.slice().reverse();
          range = range.slice().reverse();
        }
        while (++j <= k) {
          u.push(uninterpolate(domain[j - 1], domain[j]));
          i.push(interpolate(range[j - 1], range[j]));
        }
        return function(x) {
          var j = d3.bisect(domain, x, 1, k) - 1;
          return i[j](u[j](x));
        };
      }
      function d3_scale_log(linear, log) {
        function scale(x) {
          return linear(log(x));
        }
        var pow = log.pow;
        scale.invert = function(x) {
          return pow(linear.invert(x));
        };
        scale.domain = function(x) {
          if (!arguments.length) return linear.domain().map(pow);
          log = x[0] < 0 ? d3_scale_logn : d3_scale_logp;
          pow = log.pow;
          linear.domain(x.map(log));
          return scale;
        };
        scale.nice = function() {
          linear.domain(d3_scale_nice(linear.domain(), d3_scale_niceDefault));
          return scale;
        };
        scale.ticks = function() {
          var extent = d3_scaleExtent(linear.domain()), ticks = [];
          if (extent.every(isFinite)) {
            var i = Math.floor(extent[0]), j = Math.ceil(extent[1]), u = pow(extent[0]), v = pow(extent[1]);
            if (log === d3_scale_logn) {
              ticks.push(pow(i));
              for (; i++ < j; ) for (var k = 9; k > 0; k--) ticks.push(pow(i) * k);
            } else {
              for (; i < j; i++) for (var k = 1; k < 10; k++) ticks.push(pow(i) * k);
              ticks.push(pow(i));
            }
            for (i = 0; ticks[i] < u; i++) {}
            for (j = ticks.length; ticks[j - 1] > v; j--) {}
            ticks = ticks.slice(i, j);
          }
          return ticks;
        };
        scale.tickFormat = function(n, format) {
          if (arguments.length < 2) format = d3_scale_logFormat;
          if (arguments.length < 1) return format;
          var k = Math.max(.1, n / scale.ticks().length), f = log === d3_scale_logn ? (e = -1e-12, Math.floor) : (e = 1e-12, Math.ceil), e;
          return function(d) {
            return d / pow(f(log(d) + e)) <= k ? format(d) : "";
          };
        };
        scale.copy = function() {
          return d3_scale_log(linear.copy(), log);
        };
        return d3_scale_linearRebind(scale, linear);
      }
      function d3_scale_logp(x) {
        return Math.log(x < 0 ? 0 : x) / Math.LN10;
      }
      function d3_scale_logn(x) {
        return -Math.log(x > 0 ? 0 : -x) / Math.LN10;
      }
      function d3_scale_pow(linear, exponent) {
        function scale(x) {
          return linear(powp(x));
        }
        var powp = d3_scale_powPow(exponent), powb = d3_scale_powPow(1 / exponent);
        scale.invert = function(x) {
          return powb(linear.invert(x));
        };
        scale.domain = function(x) {
          if (!arguments.length) return linear.domain().map(powb);
          linear.domain(x.map(powp));
          return scale;
        };
        scale.ticks = function(m) {
          return d3_scale_linearTicks(scale.domain(), m);
        };
        scale.tickFormat = function(m) {
          return d3_scale_linearTickFormat(scale.domain(), m);
        };
        scale.nice = function() {
          return scale.domain(d3_scale_nice(scale.domain(), d3_scale_linearNice));
        };
        scale.exponent = function(x) {
          if (!arguments.length) return exponent;
          var domain = scale.domain();
          powp = d3_scale_powPow(exponent = x);
          powb = d3_scale_powPow(1 / exponent);
          return scale.domain(domain);
        };
        scale.copy = function() {
          return d3_scale_pow(linear.copy(), exponent);
        };
        return d3_scale_linearRebind(scale, linear);
      }
      function d3_scale_powPow(e) {
        return function(x) {
          return x < 0 ? -Math.pow(-x, e) : Math.pow(x, e);
        };
      }
      function d3_scale_ordinal(domain, ranger) {
        function scale(x) {
          return range[((index.get(x) || index.set(x, domain.push(x))) - 1) % range.length];
        }
        function steps(start, step) {
          return d3.range(domain.length).map(function(i) {
            return start + step * i;
          });
        }
        var index, range, rangeBand;
        scale.domain = function(x) {
          if (!arguments.length) return domain;
          domain = [];
          index = new d3_Map;
          var i = -1, n = x.length, xi;
          while (++i < n) if (!index.has(xi = x[i])) index.set(xi, domain.push(xi));
          return scale[ranger.t].apply(scale, ranger.a);
        };
        scale.range = function(x) {
          if (!arguments.length) return range;
          range = x;
          rangeBand = 0;
          ranger = {
            t: "range",
            a: arguments
          };
          return scale;
        };
        scale.rangePoints = function(x, padding) {
          if (arguments.length < 2) padding = 0;
          var start = x[0], stop = x[1], step = (stop - start) / (Math.max(1, domain.length - 1) + padding);
          range = steps(domain.length < 2 ? (start + stop) / 2 : start + step * padding / 2, step);
          rangeBand = 0;
          ranger = {
            t: "rangePoints",
            a: arguments
          };
          return scale;
        };
        scale.rangeBands = function(x, padding, outerPadding) {
          if (arguments.length < 2) padding = 0;
          if (arguments.length < 3) outerPadding = padding;
          var reverse = x[1] < x[0], start = x[reverse - 0], stop = x[1 - reverse], step = (stop - start) / (domain.length - padding + 2 * outerPadding);
          range = steps(start + step * outerPadding, step);
          if (reverse) range.reverse();
          rangeBand = step * (1 - padding);
          ranger = {
            t: "rangeBands",
            a: arguments
          };
          return scale;
        };
        scale.rangeRoundBands = function(x, padding, outerPadding) {
          if (arguments.length < 2) padding = 0;
          if (arguments.length < 3) outerPadding = padding;
          var reverse = x[1] < x[0], start = x[reverse - 0], stop = x[1 - reverse], step = Math.floor((stop - start) / (domain.length - padding + 2 * outerPadding)), error = stop - start - (domain.length - padding) * step;
          range = steps(start + Math.round(error / 2), step);
          if (reverse) range.reverse();
          rangeBand = Math.round(step * (1 - padding));
          ranger = {
            t: "rangeRoundBands",
            a: arguments
          };
          return scale;
        };
        scale.rangeBand = function() {
          return rangeBand;
        };
        scale.rangeExtent = function() {
          return d3_scaleExtent(ranger.a[0]);
        };
        scale.copy = function() {
          return d3_scale_ordinal(domain, ranger);
        };
        return scale.domain(domain);
      }
      function d3_scale_quantile(domain, range) {
        function rescale() {
          var k = 0, n = domain.length, q = range.length;
          thresholds = [];
          while (++k < q) thresholds[k - 1] = d3.quantile(domain, k / q);
          return scale;
        }
        function scale(x) {
          if (isNaN(x = +x)) return NaN;
          return range[d3.bisect(thresholds, x)];
        }
        var thresholds;
        scale.domain = function(x) {
          if (!arguments.length) return domain;
          domain = x.filter(function(d) {
            return !isNaN(d);
          }).sort(d3.ascending);
          return rescale();
        };
        scale.range = function(x) {
          if (!arguments.length) return range;
          range = x;
          return rescale();
        };
        scale.quantiles = function() {
          return thresholds;
        };
        scale.copy = function() {
          return d3_scale_quantile(domain, range);
        };
        return rescale();
      }
      function d3_scale_quantize(x0, x1, range) {
        function scale(x) {
          return range[Math.max(0, Math.min(i, Math.floor(kx * (x - x0))))];
        }
        function rescale() {
          kx = range.length / (x1 - x0);
          i = range.length - 1;
          return scale;
        }
        var kx, i;
        scale.domain = function(x) {
          if (!arguments.length) return [ x0, x1 ];
          x0 = +x[0];
          x1 = +x[x.length - 1];
          return rescale();
        };
        scale.range = function(x) {
          if (!arguments.length) return range;
          range = x;
          return rescale();
        };
        scale.copy = function() {
          return d3_scale_quantize(x0, x1, range);
        };
        return rescale();
      }
      function d3_scale_threshold(domain, range) {
        function scale(x) {
          return range[d3.bisect(domain, x)];
        }
        scale.domain = function(_) {
          if (!arguments.length) return domain;
          domain = _;
          return scale;
        };
        scale.range = function(_) {
          if (!arguments.length) return range;
          range = _;
          return scale;
        };
        scale.copy = function() {
          return d3_scale_threshold(domain, range);
        };
        return scale;
      }
      function d3_scale_identity(domain) {
        function identity(x) {
          return +x;
        }
        identity.invert = identity;
        identity.domain = identity.range = function(x) {
          if (!arguments.length) return domain;
          domain = x.map(identity);
          return identity;
        };
        identity.ticks = function(m) {
          return d3_scale_linearTicks(domain, m);
        };
        identity.tickFormat = function(m) {
          return d3_scale_linearTickFormat(domain, m);
        };
        identity.copy = function() {
          return d3_scale_identity(domain);
        };
        return identity;
      }
      function d3_svg_arcInnerRadius(d) {
        return d.innerRadius;
      }
      function d3_svg_arcOuterRadius(d) {
        return d.outerRadius;
      }
      function d3_svg_arcStartAngle(d) {
        return d.startAngle;
      }
      function d3_svg_arcEndAngle(d) {
        return d.endAngle;
      }
      function d3_svg_line(projection) {
        function line(data) {
          function segment() {
            segments.push("M", interpolate(projection(points), tension));
          }
          var segments = [], points = [], i = -1, n = data.length, d, fx = d3_functor(x), fy = d3_functor(y);
          while (++i < n) {
            if (defined.call(this, d = data[i], i)) {
              points.push([ +fx.call(this, d, i), +fy.call(this, d, i) ]);
            } else if (points.length) {
              segment();
              points = [];
            }
          }
          if (points.length) segment();
          return segments.length ? segments.join("") : null;
        }
        var x = d3_svg_lineX, y = d3_svg_lineY, defined = d3_true, interpolate = d3_svg_lineLinear, interpolateKey = interpolate.key, tension = .7;
        line.x = function(_) {
          if (!arguments.length) return x;
          x = _;
          return line;
        };
        line.y = function(_) {
          if (!arguments.length) return y;
          y = _;
          return line;
        };
        line.defined = function(_) {
          if (!arguments.length) return defined;
          defined = _;
          return line;
        };
        line.interpolate = function(_) {
          if (!arguments.length) return interpolateKey;
          if (typeof _ === "function") interpolateKey = interpolate = _; else interpolateKey = (interpolate = d3_svg_lineInterpolators.get(_) || d3_svg_lineLinear).key;
          return line;
        };
        line.tension = function(_) {
          if (!arguments.length) return tension;
          tension = _;
          return line;
        };
        return line;
      }
      function d3_svg_lineX(d) {
        return d[0];
      }
      function d3_svg_lineY(d) {
        return d[1];
      }
      function d3_svg_lineLinear(points) {
        return points.join("L");
      }
      function d3_svg_lineLinearClosed(points) {
        return d3_svg_lineLinear(points) + "Z";
      }
      function d3_svg_lineStepBefore(points) {
        var i = 0, n = points.length, p = points[0], path = [ p[0], ",", p[1] ];
        while (++i < n) path.push("V", (p = points[i])[1], "H", p[0]);
        return path.join("");
      }
      function d3_svg_lineStepAfter(points) {
        var i = 0, n = points.length, p = points[0], path = [ p[0], ",", p[1] ];
        while (++i < n) path.push("H", (p = points[i])[0], "V", p[1]);
        return path.join("");
      }
      function d3_svg_lineCardinalOpen(points, tension) {
        return points.length < 4 ? d3_svg_lineLinear(points) : points[1] + d3_svg_lineHermite(points.slice(1, points.length - 1), d3_svg_lineCardinalTangents(points, tension));
      }
      function d3_svg_lineCardinalClosed(points, tension) {
        return points.length < 3 ? d3_svg_lineLinear(points) : points[0] + d3_svg_lineHermite((points.push(points[0]), points), d3_svg_lineCardinalTangents([ points[points.length - 2] ].concat(points, [ points[1] ]), tension));
      }
      function d3_svg_lineCardinal(points, tension, closed) {
        return points.length < 3 ? d3_svg_lineLinear(points) : points[0] + d3_svg_lineHermite(points, d3_svg_lineCardinalTangents(points, tension));
      }
      function d3_svg_lineHermite(points, tangents) {
        if (tangents.length < 1 || points.length != tangents.length && points.length != tangents.length + 2) {
          return d3_svg_lineLinear(points);
        }
        var quad = points.length != tangents.length, path = "", p0 = points[0], p = points[1], t0 = tangents[0], t = t0, pi = 1;
        if (quad) {
          path += "Q" + (p[0] - t0[0] * 2 / 3) + "," + (p[1] - t0[1] * 2 / 3) + "," + p[0] + "," + p[1];
          p0 = points[1];
          pi = 2;
        }
        if (tangents.length > 1) {
          t = tangents[1];
          p = points[pi];
          pi++;
          path += "C" + (p0[0] + t0[0]) + "," + (p0[1] + t0[1]) + "," + (p[0] - t[0]) + "," + (p[1] - t[1]) + "," + p[0] + "," + p[1];
          for (var i = 2; i < tangents.length; i++, pi++) {
            p = points[pi];
            t = tangents[i];
            path += "S" + (p[0] - t[0]) + "," + (p[1] - t[1]) + "," + p[0] + "," + p[1];
          }
        }
        if (quad) {
          var lp = points[pi];
          path += "Q" + (p[0] + t[0] * 2 / 3) + "," + (p[1] + t[1] * 2 / 3) + "," + lp[0] + "," + lp[1];
        }
        return path;
      }
      function d3_svg_lineCardinalTangents(points, tension) {
        var tangents = [], a = (1 - tension) / 2, p0, p1 = points[0], p2 = points[1], i = 1, n = points.length;
        while (++i < n) {
          p0 = p1;
          p1 = p2;
          p2 = points[i];
          tangents.push([ a * (p2[0] - p0[0]), a * (p2[1] - p0[1]) ]);
        }
        return tangents;
      }
      function d3_svg_lineBasis(points) {
        if (points.length < 3) return d3_svg_lineLinear(points);
        var i = 1, n = points.length, pi = points[0], x0 = pi[0], y0 = pi[1], px = [ x0, x0, x0, (pi = points[1])[0] ], py = [ y0, y0, y0, pi[1] ], path = [ x0, ",", y0 ];
        d3_svg_lineBasisBezier(path, px, py);
        while (++i < n) {
          pi = points[i];
          px.shift();
          px.push(pi[0]);
          py.shift();
          py.push(pi[1]);
          d3_svg_lineBasisBezier(path, px, py);
        }
        i = -1;
        while (++i < 2) {
          px.shift();
          px.push(pi[0]);
          py.shift();
          py.push(pi[1]);
          d3_svg_lineBasisBezier(path, px, py);
        }
        return path.join("");
      }
      function d3_svg_lineBasisOpen(points) {
        if (points.length < 4) return d3_svg_lineLinear(points);
        var path = [], i = -1, n = points.length, pi, px = [ 0 ], py = [ 0 ];
        while (++i < 3) {
          pi = points[i];
          px.push(pi[0]);
          py.push(pi[1]);
        }
        path.push(d3_svg_lineDot4(d3_svg_lineBasisBezier3, px) + "," + d3_svg_lineDot4(d3_svg_lineBasisBezier3, py));
        --i;
        while (++i < n) {
          pi = points[i];
          px.shift();
          px.push(pi[0]);
          py.shift();
          py.push(pi[1]);
          d3_svg_lineBasisBezier(path, px, py);
        }
        return path.join("");
      }
      function d3_svg_lineBasisClosed(points) {
        var path, i = -1, n = points.length, m = n + 4, pi, px = [], py = [];
        while (++i < 4) {
          pi = points[i % n];
          px.push(pi[0]);
          py.push(pi[1]);
        }
        path = [ d3_svg_lineDot4(d3_svg_lineBasisBezier3, px), ",", d3_svg_lineDot4(d3_svg_lineBasisBezier3, py) ];
        --i;
        while (++i < m) {
          pi = points[i % n];
          px.shift();
          px.push(pi[0]);
          py.shift();
          py.push(pi[1]);
          d3_svg_lineBasisBezier(path, px, py);
        }
        return path.join("");
      }
      function d3_svg_lineBundle(points, tension) {
        var n = points.length - 1;
        if (n) {
          var x0 = points[0][0], y0 = points[0][1], dx = points[n][0] - x0, dy = points[n][1] - y0, i = -1, p, t;
          while (++i <= n) {
            p = points[i];
            t = i / n;
            p[0] = tension * p[0] + (1 - tension) * (x0 + t * dx);
            p[1] = tension * p[1] + (1 - tension) * (y0 + t * dy);
          }
        }
        return d3_svg_lineBasis(points);
      }
      function d3_svg_lineDot4(a, b) {
        return a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + a[3] * b[3];
      }
      function d3_svg_lineBasisBezier(path, x, y) {
        path.push("C", d3_svg_lineDot4(d3_svg_lineBasisBezier1, x), ",", d3_svg_lineDot4(d3_svg_lineBasisBezier1, y), ",", d3_svg_lineDot4(d3_svg_lineBasisBezier2, x), ",", d3_svg_lineDot4(d3_svg_lineBasisBezier2, y), ",", d3_svg_lineDot4(d3_svg_lineBasisBezier3, x), ",", d3_svg_lineDot4(d3_svg_lineBasisBezier3, y));
      }
      function d3_svg_lineSlope(p0, p1) {
        return (p1[1] - p0[1]) / (p1[0] - p0[0]);
      }
      function d3_svg_lineFiniteDifferences(points) {
        var i = 0, j = points.length - 1, m = [], p0 = points[0], p1 = points[1], d = m[0] = d3_svg_lineSlope(p0, p1);
        while (++i < j) {
          m[i] = (d + (d = d3_svg_lineSlope(p0 = p1, p1 = points[i + 1]))) / 2;
        }
        m[i] = d;
        return m;
      }
      function d3_svg_lineMonotoneTangents(points) {
        var tangents = [], d, a, b, s, m = d3_svg_lineFiniteDifferences(points), i = -1, j = points.length - 1;
        while (++i < j) {
          d = d3_svg_lineSlope(points[i], points[i + 1]);
          if (Math.abs(d) < 1e-6) {
            m[i] = m[i + 1] = 0;
          } else {
            a = m[i] / d;
            b = m[i + 1] / d;
            s = a * a + b * b;
            if (s > 9) {
              s = d * 3 / Math.sqrt(s);
              m[i] = s * a;
              m[i + 1] = s * b;
            }
          }
        }
        i = -1;
        while (++i <= j) {
          s = (points[Math.min(j, i + 1)][0] - points[Math.max(0, i - 1)][0]) / (6 * (1 + m[i] * m[i]));
          tangents.push([ s || 0, m[i] * s || 0 ]);
        }
        return tangents;
      }
      function d3_svg_lineMonotone(points) {
        return points.length < 3 ? d3_svg_lineLinear(points) : points[0] + d3_svg_lineHermite(points, d3_svg_lineMonotoneTangents(points));
      }
      function d3_svg_lineRadial(points) {
        var point, i = -1, n = points.length, r, a;
        while (++i < n) {
          point = points[i];
          r = point[0];
          a = point[1] + d3_svg_arcOffset;
          point[0] = r * Math.cos(a);
          point[1] = r * Math.sin(a);
        }
        return points;
      }
      function d3_svg_area(projection) {
        function area(data) {
          function segment() {
            segments.push("M", interpolate(projection(points1), tension), L, interpolateReverse(projection(points0.reverse()), tension), "Z");
          }
          var segments = [], points0 = [], points1 = [], i = -1, n = data.length, d, fx0 = d3_functor(x0), fy0 = d3_functor(y0), fx1 = x0 === x1 ? function() {
            return x;
          } : d3_functor(x1), fy1 = y0 === y1 ? function() {
            return y;
          } : d3_functor(y1), x, y;
          while (++i < n) {
            if (defined.call(this, d = data[i], i)) {
              points0.push([ x = +fx0.call(this, d, i), y = +fy0.call(this, d, i) ]);
              points1.push([ +fx1.call(this, d, i), +fy1.call(this, d, i) ]);
            } else if (points0.length) {
              segment();
              points0 = [];
              points1 = [];
            }
          }
          if (points0.length) segment();
          return segments.length ? segments.join("") : null;
        }
        var x0 = d3_svg_lineX, x1 = d3_svg_lineX, y0 = 0, y1 = d3_svg_lineY, defined = d3_true, interpolate = d3_svg_lineLinear, interpolateKey = interpolate.key, interpolateReverse = interpolate, L = "L", tension = .7;
        area.x = function(_) {
          if (!arguments.length) return x1;
          x0 = x1 = _;
          return area;
        };
        area.x0 = function(_) {
          if (!arguments.length) return x0;
          x0 = _;
          return area;
        };
        area.x1 = function(_) {
          if (!arguments.length) return x1;
          x1 = _;
          return area;
        };
        area.y = function(_) {
          if (!arguments.length) return y1;
          y0 = y1 = _;
          return area;
        };
        area.y0 = function(_) {
          if (!arguments.length) return y0;
          y0 = _;
          return area;
        };
        area.y1 = function(_) {
          if (!arguments.length) return y1;
          y1 = _;
          return area;
        };
        area.defined = function(_) {
          if (!arguments.length) return defined;
          defined = _;
          return area;
        };
        area.interpolate = function(_) {
          if (!arguments.length) return interpolateKey;
          if (typeof _ === "function") interpolateKey = interpolate = _; else interpolateKey = (interpolate = d3_svg_lineInterpolators.get(_) || d3_svg_lineLinear).key;
          interpolateReverse = interpolate.reverse || interpolate;
          L = interpolate.closed ? "M" : "L";
          return area;
        };
        area.tension = function(_) {
          if (!arguments.length) return tension;
          tension = _;
          return area;
        };
        return area;
      }
      function d3_svg_chordSource(d) {
        return d.source;
      }
      function d3_svg_chordTarget(d) {
        return d.target;
      }
      function d3_svg_chordRadius(d) {
        return d.radius;
      }
      function d3_svg_chordStartAngle(d) {
        return d.startAngle;
      }
      function d3_svg_chordEndAngle(d) {
        return d.endAngle;
      }
      function d3_svg_diagonalProjection(d) {
        return [ d.x, d.y ];
      }
      function d3_svg_diagonalRadialProjection(projection) {
        return function() {
          var d = projection.apply(this, arguments), r = d[0], a = d[1] + d3_svg_arcOffset;
          return [ r * Math.cos(a), r * Math.sin(a) ];
        };
      }
      function d3_svg_symbolSize() {
        return 64;
      }
      function d3_svg_symbolType() {
        return "circle";
      }
      function d3_svg_symbolCircle(size) {
        var r = Math.sqrt(size / Math.PI);
        return "M0," + r + "A" + r + "," + r + " 0 1,1 0," + -r + "A" + r + "," + r + " 0 1,1 0," + r + "Z";
      }
      function d3_svg_axisX(selection, x) {
        selection.attr("transform", function(d) {
          return "translate(" + x(d) + ",0)";
        });
      }
      function d3_svg_axisY(selection, y) {
        selection.attr("transform", function(d) {
          return "translate(0," + y(d) + ")";
        });
      }
      function d3_svg_axisSubdivide(scale, ticks, m) {
        subticks = [];
        if (m && ticks.length > 1) {
          var extent = d3_scaleExtent(scale.domain()), subticks, i = -1, n = ticks.length, d = (ticks[1] - ticks[0]) / ++m, j, v;
          while (++i < n) {
            for (j = m; --j > 0; ) {
              if ((v = +ticks[i] - j * d) >= extent[0]) {
                subticks.push(v);
              }
            }
          }
          for (--i, j = 0; ++j < m && (v = +ticks[i] + j * d) < extent[1]; ) {
            subticks.push(v);
          }
        }
        return subticks;
      }
      function d3_behavior_zoomDelta() {
        if (!d3_behavior_zoomDiv) {
          d3_behavior_zoomDiv = d3.select("body").append("div").style("visibility", "hidden").style("top", 0).style("height", 0).style("width", 0).style("overflow-y", "scroll").append("div").style("height", "2000px").node().parentNode;
        }
        var e = d3.event, delta;
        try {
          d3_behavior_zoomDiv.scrollTop = 1e3;
          d3_behavior_zoomDiv.dispatchEvent(e);
          delta = 1e3 - d3_behavior_zoomDiv.scrollTop;
        } catch (error) {
          delta = e.wheelDelta || -e.detail * 5;
        }
        return delta;
      }
      function d3_layout_bundlePath(link) {
        var start = link.source, end = link.target, lca = d3_layout_bundleLeastCommonAncestor(start, end), points = [ start ];
        while (start !== lca) {
          start = start.parent;
          points.push(start);
        }
        var k = points.length;
        while (end !== lca) {
          points.splice(k, 0, end);
          end = end.parent;
        }
        return points;
      }
      function d3_layout_bundleAncestors(node) {
        var ancestors = [], parent = node.parent;
        while (parent != null) {
          ancestors.push(node);
          node = parent;
          parent = parent.parent;
        }
        ancestors.push(node);
        return ancestors;
      }
      function d3_layout_bundleLeastCommonAncestor(a, b) {
        if (a === b) return a;
        var aNodes = d3_layout_bundleAncestors(a), bNodes = d3_layout_bundleAncestors(b), aNode = aNodes.pop(), bNode = bNodes.pop(), sharedNode = null;
        while (aNode === bNode) {
          sharedNode = aNode;
          aNode = aNodes.pop();
          bNode = bNodes.pop();
        }
        return sharedNode;
      }
      function d3_layout_forceDragstart(d) {
        d.fixed |= 2;
      }
      function d3_layout_forceDragend(d) {
        d.fixed &= 1;
      }
      function d3_layout_forceMouseover(d) {
        d.fixed |= 4;
      }
      function d3_layout_forceMouseout(d) {
        d.fixed &= 3;
      }
      function d3_layout_forceAccumulate(quad, alpha, charges) {
        var cx = 0, cy = 0;
        quad.charge = 0;
        if (!quad.leaf) {
          var nodes = quad.nodes, n = nodes.length, i = -1, c;
          while (++i < n) {
            c = nodes[i];
            if (c == null) continue;
            d3_layout_forceAccumulate(c, alpha, charges);
            quad.charge += c.charge;
            cx += c.charge * c.cx;
            cy += c.charge * c.cy;
          }
        }
        if (quad.point) {
          if (!quad.leaf) {
            quad.point.x += Math.random() - .5;
            quad.point.y += Math.random() - .5;
          }
          var k = alpha * charges[quad.point.index];
          quad.charge += quad.pointCharge = k;
          cx += k * quad.point.x;
          cy += k * quad.point.y;
        }
        quad.cx = cx / quad.charge;
        quad.cy = cy / quad.charge;
      }
      function d3_layout_forceLinkDistance(link) {
        return 20;
      }
      function d3_layout_forceLinkStrength(link) {
        return 1;
      }
      function d3_layout_stackX(d) {
        return d.x;
      }
      function d3_layout_stackY(d) {
        return d.y;
      }
      function d3_layout_stackOut(d, y0, y) {
        d.y0 = y0;
        d.y = y;
      }
      function d3_layout_stackOrderDefault(data) {
        return d3.range(data.length);
      }
      function d3_layout_stackOffsetZero(data) {
        var j = -1, m = data[0].length, y0 = [];
        while (++j < m) y0[j] = 0;
        return y0;
      }
      function d3_layout_stackMaxIndex(array) {
        var i = 1, j = 0, v = array[0][1], k, n = array.length;
        for (; i < n; ++i) {
          if ((k = array[i][1]) > v) {
            j = i;
            v = k;
          }
        }
        return j;
      }
      function d3_layout_stackReduceSum(d) {
        return d.reduce(d3_layout_stackSum, 0);
      }
      function d3_layout_stackSum(p, d) {
        return p + d[1];
      }
      function d3_layout_histogramBinSturges(range, values) {
        return d3_layout_histogramBinFixed(range, Math.ceil(Math.log(values.length) / Math.LN2 + 1));
      }
      function d3_layout_histogramBinFixed(range, n) {
        var x = -1, b = +range[0], m = (range[1] - b) / n, f = [];
        while (++x <= n) f[x] = m * x + b;
        return f;
      }
      function d3_layout_histogramRange(values) {
        return [ d3.min(values), d3.max(values) ];
      }
      function d3_layout_hierarchyRebind(object, hierarchy) {
        d3.rebind(object, hierarchy, "sort", "children", "value");
        object.links = d3_layout_hierarchyLinks;
        object.nodes = function(d) {
          d3_layout_hierarchyInline = true;
          return (object.nodes = object)(d);
        };
        return object;
      }
      function d3_layout_hierarchyChildren(d) {
        return d.children;
      }
      function d3_layout_hierarchyValue(d) {
        return d.value;
      }
      function d3_layout_hierarchySort(a, b) {
        return b.value - a.value;
      }
      function d3_layout_hierarchyLinks(nodes) {
        return d3.merge(nodes.map(function(parent) {
          return (parent.children || []).map(function(child) {
            return {
              source: parent,
              target: child
            };
          });
        }));
      }
      function d3_layout_packSort(a, b) {
        return a.value - b.value;
      }
      function d3_layout_packInsert(a, b) {
        var c = a._pack_next;
        a._pack_next = b;
        b._pack_prev = a;
        b._pack_next = c;
        c._pack_prev = b;
      }
      function d3_layout_packSplice(a, b) {
        a._pack_next = b;
        b._pack_prev = a;
      }
      function d3_layout_packIntersects(a, b) {
        var dx = b.x - a.x, dy = b.y - a.y, dr = a.r + b.r;
        return dr * dr - dx * dx - dy * dy > .001;
      }
      function d3_layout_packSiblings(node) {
        function bound(node) {
          xMin = Math.min(node.x - node.r, xMin);
          xMax = Math.max(node.x + node.r, xMax);
          yMin = Math.min(node.y - node.r, yMin);
          yMax = Math.max(node.y + node.r, yMax);
        }
        if (!(nodes = node.children) || !(n = nodes.length)) return;
        var nodes, xMin = Infinity, xMax = -Infinity, yMin = Infinity, yMax = -Infinity, a, b, c, i, j, k, n;
        nodes.forEach(d3_layout_packLink);
        a = nodes[0];
        a.x = -a.r;
        a.y = 0;
        bound(a);
        if (n > 1) {
          b = nodes[1];
          b.x = b.r;
          b.y = 0;
          bound(b);
          if (n > 2) {
            c = nodes[2];
            d3_layout_packPlace(a, b, c);
            bound(c);
            d3_layout_packInsert(a, c);
            a._pack_prev = c;
            d3_layout_packInsert(c, b);
            b = a._pack_next;
            for (i = 3; i < n; i++) {
              d3_layout_packPlace(a, b, c = nodes[i]);
              var isect = 0, s1 = 1, s2 = 1;
              for (j = b._pack_next; j !== b; j = j._pack_next, s1++) {
                if (d3_layout_packIntersects(j, c)) {
                  isect = 1;
                  break;
                }
              }
              if (isect == 1) {
                for (k = a._pack_prev; k !== j._pack_prev; k = k._pack_prev, s2++) {
                  if (d3_layout_packIntersects(k, c)) {
                    break;
                  }
                }
              }
              if (isect) {
                if (s1 < s2 || s1 == s2 && b.r < a.r) d3_layout_packSplice(a, b = j); else d3_layout_packSplice(a = k, b);
                i--;
              } else {
                d3_layout_packInsert(a, c);
                b = c;
                bound(c);
              }
            }
          }
        }
        var cx = (xMin + xMax) / 2, cy = (yMin + yMax) / 2, cr = 0;
        for (i = 0; i < n; i++) {
          c = nodes[i];
          c.x -= cx;
          c.y -= cy;
          cr = Math.max(cr, c.r + Math.sqrt(c.x * c.x + c.y * c.y));
        }
        node.r = cr;
        nodes.forEach(d3_layout_packUnlink);
      }
      function d3_layout_packLink(node) {
        node._pack_next = node._pack_prev = node;
      }
      function d3_layout_packUnlink(node) {
        delete node._pack_next;
        delete node._pack_prev;
      }
      function d3_layout_packTransform(node, x, y, k) {
        var children = node.children;
        node.x = x += k * node.x;
        node.y = y += k * node.y;
        node.r *= k;
        if (children) {
          var i = -1, n = children.length;
          while (++i < n) d3_layout_packTransform(children[i], x, y, k);
        }
      }
      function d3_layout_packPlace(a, b, c) {
        var db = a.r + c.r, dx = b.x - a.x, dy = b.y - a.y;
        if (db && (dx || dy)) {
          var da = b.r + c.r, dc = dx * dx + dy * dy;
          da *= da;
          db *= db;
          var x = .5 + (db - da) / (2 * dc), y = Math.sqrt(Math.max(0, 2 * da * (db + dc) - (db -= dc) * db - da * da)) / (2 * dc);
          c.x = a.x + x * dx + y * dy;
          c.y = a.y + x * dy - y * dx;
        } else {
          c.x = a.x + db;
          c.y = a.y;
        }
      }
      function d3_layout_clusterY(children) {
        return 1 + d3.max(children, function(child) {
          return child.y;
        });
      }
      function d3_layout_clusterX(children) {
        return children.reduce(function(x, child) {
          return x + child.x;
        }, 0) / children.length;
      }
      function d3_layout_clusterLeft(node) {
        var children = node.children;
        return children && children.length ? d3_layout_clusterLeft(children[0]) : node;
      }
      function d3_layout_clusterRight(node) {
        var children = node.children, n;
        return children && (n = children.length) ? d3_layout_clusterRight(children[n - 1]) : node;
      }
      function d3_layout_treeSeparation(a, b) {
        return a.parent == b.parent ? 1 : 2;
      }
      function d3_layout_treeLeft(node) {
        var children = node.children;
        return children && children.length ? children[0] : node._tree.thread;
      }
      function d3_layout_treeRight(node) {
        var children = node.children, n;
        return children && (n = children.length) ? children[n - 1] : node._tree.thread;
      }
      function d3_layout_treeSearch(node, compare) {
        var children = node.children;
        if (children && (n = children.length)) {
          var child, n, i = -1;
          while (++i < n) {
            if (compare(child = d3_layout_treeSearch(children[i], compare), node) > 0) {
              node = child;
            }
          }
        }
        return node;
      }
      function d3_layout_treeRightmost(a, b) {
        return a.x - b.x;
      }
      function d3_layout_treeLeftmost(a, b) {
        return b.x - a.x;
      }
      function d3_layout_treeDeepest(a, b) {
        return a.depth - b.depth;
      }
      function d3_layout_treeVisitAfter(node, callback) {
        function visit(node, previousSibling) {
          var children = node.children;
          if (children && (n = children.length)) {
            var child, previousChild = null, i = -1, n;
            while (++i < n) {
              child = children[i];
              visit(child, previousChild);
              previousChild = child;
            }
          }
          callback(node, previousSibling);
        }
        visit(node, null);
      }
      function d3_layout_treeShift(node) {
        var shift = 0, change = 0, children = node.children, i = children.length, child;
        while (--i >= 0) {
          child = children[i]._tree;
          child.prelim += shift;
          child.mod += shift;
          shift += child.shift + (change += child.change);
        }
      }
      function d3_layout_treeMove(ancestor, node, shift) {
        ancestor = ancestor._tree;
        node = node._tree;
        var change = shift / (node.number - ancestor.number);
        ancestor.change += change;
        node.change -= change;
        node.shift += shift;
        node.prelim += shift;
        node.mod += shift;
      }
      function d3_layout_treeAncestor(vim, node, ancestor) {
        return vim._tree.ancestor.parent == node.parent ? vim._tree.ancestor : ancestor;
      }
      function d3_layout_treemapPadNull(node) {
        return {
          x: node.x,
          y: node.y,
          dx: node.dx,
          dy: node.dy
        };
      }
      function d3_layout_treemapPad(node, padding) {
        var x = node.x + padding[3], y = node.y + padding[0], dx = node.dx - padding[1] - padding[3], dy = node.dy - padding[0] - padding[2];
        if (dx < 0) {
          x += dx / 2;
          dx = 0;
        }
        if (dy < 0) {
          y += dy / 2;
          dy = 0;
        }
        return {
          x: x,
          y: y,
          dx: dx,
          dy: dy
        };
      }
      function d3_dsv(delimiter, mimeType) {
        function dsv(url, callback) {
          d3.text(url, mimeType, function(text) {
            callback(text && dsv.parse(text));
          });
        }
        function formatRow(row) {
          return row.map(formatValue).join(delimiter);
        }
        function formatValue(text) {
          return reFormat.test(text) ? '"' + text.replace(/\"/g, '""') + '"' : text;
        }
        var reParse = new RegExp("\r\n|[" + delimiter + "\r\n]", "g"), reFormat = new RegExp('["' + delimiter + "\n]"), delimiterCode = delimiter.charCodeAt(0);
        dsv.parse = function(text) {
          var header;
          return dsv.parseRows(text, function(row, i) {
            if (i) {
              var o = {}, j = -1, m = header.length;
              while (++j < m) o[header[j]] = row[j];
              return o;
            } else {
              header = row;
              return null;
            }
          });
        };
        dsv.parseRows = function(text, f) {
          function token() {
            if (reParse.lastIndex >= text.length) return EOF;
            if (eol) {
              eol = false;
              return EOL;
            }
            var j = reParse.lastIndex;
            if (text.charCodeAt(j) === 34) {
              var i = j;
              while (i++ < text.length) {
                if (text.charCodeAt(i) === 34) {
                  if (text.charCodeAt(i + 1) !== 34) break;
                  i++;
                }
              }
              reParse.lastIndex = i + 2;
              var c = text.charCodeAt(i + 1);
              if (c === 13) {
                eol = true;
                if (text.charCodeAt(i + 2) === 10) reParse.lastIndex++;
              } else if (c === 10) {
                eol = true;
              }
              return text.substring(j + 1, i).replace(/""/g, '"');
            }
            var m = reParse.exec(text);
            if (m) {
              eol = m[0].charCodeAt(0) !== delimiterCode;
              return text.substring(j, m.index);
            }
            reParse.lastIndex = text.length;
            return text.substring(j);
          }
          var EOL = {}, EOF = {}, rows = [], n = 0, t, eol;
          reParse.lastIndex = 0;
          while ((t = token()) !== EOF) {
            var a = [];
            while (t !== EOL && t !== EOF) {
              a.push(t);
              t = token();
            }
            if (f && !(a = f(a, n++))) continue;
            rows.push(a);
          }
          return rows;
        };
        dsv.format = function(rows) {
          return rows.map(formatRow).join("\n");
        };
        return dsv;
      }
      function d3_geo_type(types, defaultValue) {
        return function(object) {
          return object && types.hasOwnProperty(object.type) ? types[object.type](object) : defaultValue;
        };
      }
      function d3_path_circle(radius) {
        return "m0," + radius + "a" + radius + "," + radius + " 0 1,1 0," + -2 * radius + "a" + radius + "," + radius + " 0 1,1 0," + +2 * radius + "z";
      }
      function d3_geo_bounds(o, f) {
        if (d3_geo_boundsTypes.hasOwnProperty(o.type)) d3_geo_boundsTypes[o.type](o, f);
      }
      function d3_geo_boundsFeature(o, f) {
        d3_geo_bounds(o.geometry, f);
      }
      function d3_geo_boundsFeatureCollection(o, f) {
        for (var a = o.features, i = 0, n = a.length; i < n; i++) {
          d3_geo_bounds(a[i].geometry, f);
        }
      }
      function d3_geo_boundsGeometryCollection(o, f) {
        for (var a = o.geometries, i = 0, n = a.length; i < n; i++) {
          d3_geo_bounds(a[i], f);
        }
      }
      function d3_geo_boundsLineString(o, f) {
        for (var a = o.coordinates, i = 0, n = a.length; i < n; i++) {
          f.apply(null, a[i]);
        }
      }
      function d3_geo_boundsMultiLineString(o, f) {
        for (var a = o.coordinates, i = 0, n = a.length; i < n; i++) {
          for (var b = a[i], j = 0, m = b.length; j < m; j++) {
            f.apply(null, b[j]);
          }
        }
      }
      function d3_geo_boundsMultiPolygon(o, f) {
        for (var a = o.coordinates, i = 0, n = a.length; i < n; i++) {
          for (var b = a[i][0], j = 0, m = b.length; j < m; j++) {
            f.apply(null, b[j]);
          }
        }
      }
      function d3_geo_boundsPoint(o, f) {
        f.apply(null, o.coordinates);
      }
      function d3_geo_boundsPolygon(o, f) {
        for (var a = o.coordinates[0], i = 0, n = a.length; i < n; i++) {
          f.apply(null, a[i]);
        }
      }
      function d3_geo_greatArcSource(d) {
        return d.source;
      }
      function d3_geo_greatArcTarget(d) {
        return d.target;
      }
      function d3_geo_greatArcInterpolator() {
        function interpolate(t) {
          var B = Math.sin(t *= d) * k, A = Math.sin(d - t) * k, x = A * kx0 + B * kx1, y = A * ky0 + B * ky1, z = A * sy0 + B * sy1;
          return [ Math.atan2(y, x) / d3_geo_radians, Math.atan2(z, Math.sqrt(x * x + y * y)) / d3_geo_radians ];
        }
        var x0, y0, cy0, sy0, kx0, ky0, x1, y1, cy1, sy1, kx1, ky1, d, k;
        interpolate.distance = function() {
          if (d == null) k = 1 / Math.sin(d = Math.acos(Math.max(-1, Math.min(1, sy0 * sy1 + cy0 * cy1 * Math.cos(x1 - x0)))));
          return d;
        };
        interpolate.source = function(_) {
          var cx0 = Math.cos(x0 = _[0] * d3_geo_radians), sx0 = Math.sin(x0);
          cy0 = Math.cos(y0 = _[1] * d3_geo_radians);
          sy0 = Math.sin(y0);
          kx0 = cy0 * cx0;
          ky0 = cy0 * sx0;
          d = null;
          return interpolate;
        };
        interpolate.target = function(_) {
          var cx1 = Math.cos(x1 = _[0] * d3_geo_radians), sx1 = Math.sin(x1);
          cy1 = Math.cos(y1 = _[1] * d3_geo_radians);
          sy1 = Math.sin(y1);
          kx1 = cy1 * cx1;
          ky1 = cy1 * sx1;
          d = null;
          return interpolate;
        };
        return interpolate;
      }
      function d3_geo_greatArcInterpolate(a, b) {
        var i = d3_geo_greatArcInterpolator().source(a).target(b);
        i.distance();
        return i;
      }
      function d3_geom_contourStart(grid) {
        var x = 0, y = 0;
        while (true) {
          if (grid(x, y)) {
            return [ x, y ];
          }
          if (x === 0) {
            x = y + 1;
            y = 0;
          } else {
            x = x - 1;
            y = y + 1;
          }
        }
      }
      function d3_geom_hullCCW(i1, i2, i3, v) {
        var t, a, b, c, d, e, f;
        t = v[i1];
        a = t[0];
        b = t[1];
        t = v[i2];
        c = t[0];
        d = t[1];
        t = v[i3];
        e = t[0];
        f = t[1];
        return (f - b) * (c - a) - (d - b) * (e - a) > 0;
      }
      function d3_geom_polygonInside(p, a, b) {
        return (b[0] - a[0]) * (p[1] - a[1]) < (b[1] - a[1]) * (p[0] - a[0]);
      }
      function d3_geom_polygonIntersect(c, d, a, b) {
        var x1 = c[0], x2 = d[0], x3 = a[0], x4 = b[0], y1 = c[1], y2 = d[1], y3 = a[1], y4 = b[1], x13 = x1 - x3, x21 = x2 - x1, x43 = x4 - x3, y13 = y1 - y3, y21 = y2 - y1, y43 = y4 - y3, ua = (x43 * y13 - y43 * x13) / (y43 * x21 - x43 * y21);
        return [ x1 + ua * x21, y1 + ua * y21 ];
      }
      function d3_voronoi_tessellate(vertices, callback) {
        var Sites = {
          list: vertices.map(function(v, i) {
            return {
              index: i,
              x: v[0],
              y: v[1]
            };
          }).sort(function(a, b) {
            return a.y < b.y ? -1 : a.y > b.y ? 1 : a.x < b.x ? -1 : a.x > b.x ? 1 : 0;
          }),
          bottomSite: null
        };
        var EdgeList = {
          list: [],
          leftEnd: null,
          rightEnd: null,
          init: function() {
            EdgeList.leftEnd = EdgeList.createHalfEdge(null, "l");
            EdgeList.rightEnd = EdgeList.createHalfEdge(null, "l");
            EdgeList.leftEnd.r = EdgeList.rightEnd;
            EdgeList.rightEnd.l = EdgeList.leftEnd;
            EdgeList.list.unshift(EdgeList.leftEnd, EdgeList.rightEnd);
          },
          createHalfEdge: function(edge, side) {
            return {
              edge: edge,
              side: side,
              vertex: null,
              l: null,
              r: null
            };
          },
          insert: function(lb, he) {
            he.l = lb;
            he.r = lb.r;
            lb.r.l = he;
            lb.r = he;
          },
          leftBound: function(p) {
            var he = EdgeList.leftEnd;
            do {
              he = he.r;
            } while (he != EdgeList.rightEnd && Geom.rightOf(he, p));
            he = he.l;
            return he;
          },
          del: function(he) {
            he.l.r = he.r;
            he.r.l = he.l;
            he.edge = null;
          },
          right: function(he) {
            return he.r;
          },
          left: function(he) {
            return he.l;
          },
          leftRegion: function(he) {
            return he.edge == null ? Sites.bottomSite : he.edge.region[he.side];
          },
          rightRegion: function(he) {
            return he.edge == null ? Sites.bottomSite : he.edge.region[d3_voronoi_opposite[he.side]];
          }
        };
        var Geom = {
          bisect: function(s1, s2) {
            var newEdge = {
              region: {
                l: s1,
                r: s2
              },
              ep: {
                l: null,
                r: null
              }
            };
            var dx = s2.x - s1.x, dy = s2.y - s1.y, adx = dx > 0 ? dx : -dx, ady = dy > 0 ? dy : -dy;
            newEdge.c = s1.x * dx + s1.y * dy + (dx * dx + dy * dy) * .5;
            if (adx > ady) {
              newEdge.a = 1;
              newEdge.b = dy / dx;
              newEdge.c /= dx;
            } else {
              newEdge.b = 1;
              newEdge.a = dx / dy;
              newEdge.c /= dy;
            }
            return newEdge;
          },
          intersect: function(el1, el2) {
            var e1 = el1.edge, e2 = el2.edge;
            if (!e1 || !e2 || e1.region.r == e2.region.r) {
              return null;
            }
            var d = e1.a * e2.b - e1.b * e2.a;
            if (Math.abs(d) < 1e-10) {
              return null;
            }
            var xint = (e1.c * e2.b - e2.c * e1.b) / d, yint = (e2.c * e1.a - e1.c * e2.a) / d, e1r = e1.region.r, e2r = e2.region.r, el, e;
            if (e1r.y < e2r.y || e1r.y == e2r.y && e1r.x < e2r.x) {
              el = el1;
              e = e1;
            } else {
              el = el2;
              e = e2;
            }
            var rightOfSite = xint >= e.region.r.x;
            if (rightOfSite && el.side === "l" || !rightOfSite && el.side === "r") {
              return null;
            }
            return {
              x: xint,
              y: yint
            };
          },
          rightOf: function(he, p) {
            var e = he.edge, topsite = e.region.r, rightOfSite = p.x > topsite.x;
            if (rightOfSite && he.side === "l") {
              return 1;
            }
            if (!rightOfSite && he.side === "r") {
              return 0;
            }
            if (e.a === 1) {
              var dyp = p.y - topsite.y, dxp = p.x - topsite.x, fast = 0, above = 0;
              if (!rightOfSite && e.b < 0 || rightOfSite && e.b >= 0) {
                above = fast = dyp >= e.b * dxp;
              } else {
                above = p.x + p.y * e.b > e.c;
                if (e.b < 0) {
                  above = !above;
                }
                if (!above) {
                  fast = 1;
                }
              }
              if (!fast) {
                var dxs = topsite.x - e.region.l.x;
                above = e.b * (dxp * dxp - dyp * dyp) < dxs * dyp * (1 + 2 * dxp / dxs + e.b * e.b);
                if (e.b < 0) {
                  above = !above;
                }
              }
            } else {
              var yl = e.c - e.a * p.x, t1 = p.y - yl, t2 = p.x - topsite.x, t3 = yl - topsite.y;
              above = t1 * t1 > t2 * t2 + t3 * t3;
            }
            return he.side === "l" ? above : !above;
          },
          endPoint: function(edge, side, site) {
            edge.ep[side] = site;
            if (!edge.ep[d3_voronoi_opposite[side]]) return;
            callback(edge);
          },
          distance: function(s, t) {
            var dx = s.x - t.x, dy = s.y - t.y;
            return Math.sqrt(dx * dx + dy * dy);
          }
        };
        var EventQueue = {
          list: [],
          insert: function(he, site, offset) {
            he.vertex = site;
            he.ystar = site.y + offset;
            for (var i = 0, list = EventQueue.list, l = list.length; i < l; i++) {
              var next = list[i];
              if (he.ystar > next.ystar || he.ystar == next.ystar && site.x > next.vertex.x) {
                continue;
              } else {
                break;
              }
            }
            list.splice(i, 0, he);
          },
          del: function(he) {
            for (var i = 0, ls = EventQueue.list, l = ls.length; i < l && ls[i] != he; ++i) {}
            ls.splice(i, 1);
          },
          empty: function() {
            return EventQueue.list.length === 0;
          },
          nextEvent: function(he) {
            for (var i = 0, ls = EventQueue.list, l = ls.length; i < l; ++i) {
              if (ls[i] == he) return ls[i + 1];
            }
            return null;
          },
          min: function() {
            var elem = EventQueue.list[0];
            return {
              x: elem.vertex.x,
              y: elem.ystar
            };
          },
          extractMin: function() {
            return EventQueue.list.shift();
          }
        };
        EdgeList.init();
        Sites.bottomSite = Sites.list.shift();
        var newSite = Sites.list.shift(), newIntStar;
        var lbnd, rbnd, llbnd, rrbnd, bisector;
        var bot, top, temp, p, v;
        var e, pm;
        while (true) {
          if (!EventQueue.empty()) {
            newIntStar = EventQueue.min();
          }
          if (newSite && (EventQueue.empty() || newSite.y < newIntStar.y || newSite.y == newIntStar.y && newSite.x < newIntStar.x)) {
            lbnd = EdgeList.leftBound(newSite);
            rbnd = EdgeList.right(lbnd);
            bot = EdgeList.rightRegion(lbnd);
            e = Geom.bisect(bot, newSite);
            bisector = EdgeList.createHalfEdge(e, "l");
            EdgeList.insert(lbnd, bisector);
            p = Geom.intersect(lbnd, bisector);
            if (p) {
              EventQueue.del(lbnd);
              EventQueue.insert(lbnd, p, Geom.distance(p, newSite));
            }
            lbnd = bisector;
            bisector = EdgeList.createHalfEdge(e, "r");
            EdgeList.insert(lbnd, bisector);
            p = Geom.intersect(bisector, rbnd);
            if (p) {
              EventQueue.insert(bisector, p, Geom.distance(p, newSite));
            }
            newSite = Sites.list.shift();
          } else if (!EventQueue.empty()) {
            lbnd = EventQueue.extractMin();
            llbnd = EdgeList.left(lbnd);
            rbnd = EdgeList.right(lbnd);
            rrbnd = EdgeList.right(rbnd);
            bot = EdgeList.leftRegion(lbnd);
            top = EdgeList.rightRegion(rbnd);
            v = lbnd.vertex;
            Geom.endPoint(lbnd.edge, lbnd.side, v);
            Geom.endPoint(rbnd.edge, rbnd.side, v);
            EdgeList.del(lbnd);
            EventQueue.del(rbnd);
            EdgeList.del(rbnd);
            pm = "l";
            if (bot.y > top.y) {
              temp = bot;
              bot = top;
              top = temp;
              pm = "r";
            }
            e = Geom.bisect(bot, top);
            bisector = EdgeList.createHalfEdge(e, pm);
            EdgeList.insert(llbnd, bisector);
            Geom.endPoint(e, d3_voronoi_opposite[pm], v);
            p = Geom.intersect(llbnd, bisector);
            if (p) {
              EventQueue.del(llbnd);
              EventQueue.insert(llbnd, p, Geom.distance(p, bot));
            }
            p = Geom.intersect(bisector, rrbnd);
            if (p) {
              EventQueue.insert(bisector, p, Geom.distance(p, bot));
            }
          } else {
            break;
          }
        }
        for (lbnd = EdgeList.right(EdgeList.leftEnd); lbnd != EdgeList.rightEnd; lbnd = EdgeList.right(lbnd)) {
          callback(lbnd.edge);
        }
      }
      function d3_geom_quadtreeNode() {
        return {
          leaf: true,
          nodes: [],
          point: null
        };
      }
      function d3_geom_quadtreeVisit(f, node, x1, y1, x2, y2) {
        if (!f(node, x1, y1, x2, y2)) {
          var sx = (x1 + x2) * .5, sy = (y1 + y2) * .5, children = node.nodes;
          if (children[0]) d3_geom_quadtreeVisit(f, children[0], x1, y1, sx, sy);
          if (children[1]) d3_geom_quadtreeVisit(f, children[1], sx, y1, x2, sy);
          if (children[2]) d3_geom_quadtreeVisit(f, children[2], x1, sy, sx, y2);
          if (children[3]) d3_geom_quadtreeVisit(f, children[3], sx, sy, x2, y2);
        }
      }
      function d3_geom_quadtreePoint(p) {
        return {
          x: p[0],
          y: p[1]
        };
      }
      function d3_time_utc() {
        this._ = new Date(arguments.length > 1 ? Date.UTC.apply(this, arguments) : arguments[0]);
      }
      function d3_time_formatAbbreviate(name) {
        return name.substring(0, 3);
      }
      function d3_time_parse(date, template, string, j) {
        var c, p, i = 0, n = template.length, m = string.length;
        while (i < n) {
          if (j >= m) return -1;
          c = template.charCodeAt(i++);
          if (c == 37) {
            p = d3_time_parsers[template.charAt(i++)];
            if (!p || (j = p(date, string, j)) < 0) return -1;
          } else if (c != string.charCodeAt(j++)) {
            return -1;
          }
        }
        return j;
      }
      function d3_time_formatRe(names) {
        return new RegExp("^(?:" + names.map(d3.requote).join("|") + ")", "i");
      }
      function d3_time_formatLookup(names) {
        var map = new d3_Map, i = -1, n = names.length;
        while (++i < n) map.set(names[i].toLowerCase(), i);
        return map;
      }
      function d3_time_parseWeekdayAbbrev(date, string, i) {
        d3_time_dayAbbrevRe.lastIndex = 0;
        var n = d3_time_dayAbbrevRe.exec(string.substring(i));
        return n ? i += n[0].length : -1;
      }
      function d3_time_parseWeekday(date, string, i) {
        d3_time_dayRe.lastIndex = 0;
        var n = d3_time_dayRe.exec(string.substring(i));
        return n ? i += n[0].length : -1;
      }
      function d3_time_parseMonthAbbrev(date, string, i) {
        d3_time_monthAbbrevRe.lastIndex = 0;
        var n = d3_time_monthAbbrevRe.exec(string.substring(i));
        return n ? (date.m = d3_time_monthAbbrevLookup.get(n[0].toLowerCase()), i += n[0].length) : -1;
      }
      function d3_time_parseMonth(date, string, i) {
        d3_time_monthRe.lastIndex = 0;
        var n = d3_time_monthRe.exec(string.substring(i));
        return n ? (date.m = d3_time_monthLookup.get(n[0].toLowerCase()), i += n[0].length) : -1;
      }
      function d3_time_parseLocaleFull(date, string, i) {
        return d3_time_parse(date, d3_time_formats.c.toString(), string, i);
      }
      function d3_time_parseLocaleDate(date, string, i) {
        return d3_time_parse(date, d3_time_formats.x.toString(), string, i);
      }
      function d3_time_parseLocaleTime(date, string, i) {
        return d3_time_parse(date, d3_time_formats.X.toString(), string, i);
      }
      function d3_time_parseFullYear(date, string, i) {
        d3_time_numberRe.lastIndex = 0;
        var n = d3_time_numberRe.exec(string.substring(i, i + 4));
        return n ? (date.y = +n[0], i += n[0].length) : -1;
      }
      function d3_time_parseYear(date, string, i) {
        d3_time_numberRe.lastIndex = 0;
        var n = d3_time_numberRe.exec(string.substring(i, i + 2));
        return n ? (date.y = d3_time_expandYear(+n[0]), i += n[0].length) : -1;
      }
      function d3_time_expandYear(d) {
        return d + (d > 68 ? 1900 : 2e3);
      }
      function d3_time_parseMonthNumber(date, string, i) {
        d3_time_numberRe.lastIndex = 0;
        var n = d3_time_numberRe.exec(string.substring(i, i + 2));
        return n ? (date.m = n[0] - 1, i += n[0].length) : -1;
      }
      function d3_time_parseDay(date, string, i) {
        d3_time_numberRe.lastIndex = 0;
        var n = d3_time_numberRe.exec(string.substring(i, i + 2));
        return n ? (date.d = +n[0], i += n[0].length) : -1;
      }
      function d3_time_parseHour24(date, string, i) {
        d3_time_numberRe.lastIndex = 0;
        var n = d3_time_numberRe.exec(string.substring(i, i + 2));
        return n ? (date.H = +n[0], i += n[0].length) : -1;
      }
      function d3_time_parseMinutes(date, string, i) {
        d3_time_numberRe.lastIndex = 0;
        var n = d3_time_numberRe.exec(string.substring(i, i + 2));
        return n ? (date.M = +n[0], i += n[0].length) : -1;
      }
      function d3_time_parseSeconds(date, string, i) {
        d3_time_numberRe.lastIndex = 0;
        var n = d3_time_numberRe.exec(string.substring(i, i + 2));
        return n ? (date.S = +n[0], i += n[0].length) : -1;
      }
      function d3_time_parseMilliseconds(date, string, i) {
        d3_time_numberRe.lastIndex = 0;
        var n = d3_time_numberRe.exec(string.substring(i, i + 3));
        return n ? (date.L = +n[0], i += n[0].length) : -1;
      }
      function d3_time_parseAmPm(date, string, i) {
        var n = d3_time_amPmLookup.get(string.substring(i, i += 2).toLowerCase());
        return n == null ? -1 : (date.p = n, i);
      }
      function d3_time_zone(d) {
        var z = d.getTimezoneOffset(), zs = z > 0 ? "-" : "+", zh = ~~(Math.abs(z) / 60), zm = Math.abs(z) % 60;
        return zs + d3_time_zfill2(zh) + d3_time_zfill2(zm);
      }
      function d3_time_formatIsoNative(date) {
        return date.toISOString();
      }
      function d3_time_interval(local, step, number) {
        function round(date) {
          var d0 = local(date), d1 = offset(d0, 1);
          return date - d0 < d1 - date ? d0 : d1;
        }
        function ceil(date) {
          step(date = local(new d3_time(date - 1)), 1);
          return date;
        }
        function offset(date, k) {
          step(date = new d3_time(+date), k);
          return date;
        }
        function range(t0, t1, dt) {
          var time = ceil(t0), times = [];
          if (dt > 1) {
            while (time < t1) {
              if (!(number(time) % dt)) times.push(new Date(+time));
              step(time, 1);
            }
          } else {
            while (time < t1) times.push(new Date(+time)), step(time, 1);
          }
          return times;
        }
        function range_utc(t0, t1, dt) {
          try {
            d3_time = d3_time_utc;
            var utc = new d3_time_utc;
            utc._ = t0;
            return range(utc, t1, dt);
          } finally {
            d3_time = Date;
          }
        }
        local.floor = local;
        local.round = round;
        local.ceil = ceil;
        local.offset = offset;
        local.range = range;
        var utc = local.utc = d3_time_interval_utc(local);
        utc.floor = utc;
        utc.round = d3_time_interval_utc(round);
        utc.ceil = d3_time_interval_utc(ceil);
        utc.offset = d3_time_interval_utc(offset);
        utc.range = range_utc;
        return local;
      }
      function d3_time_interval_utc(method) {
        return function(date, k) {
          try {
            d3_time = d3_time_utc;
            var utc = new d3_time_utc;
            utc._ = date;
            return method(utc, k)._;
          } finally {
            d3_time = Date;
          }
        };
      }
      function d3_time_scale(linear, methods, format) {
        function scale(x) {
          return linear(x);
        }
        scale.invert = function(x) {
          return d3_time_scaleDate(linear.invert(x));
        };
        scale.domain = function(x) {
          if (!arguments.length) return linear.domain().map(d3_time_scaleDate);
          linear.domain(x);
          return scale;
        };
        scale.nice = function(m) {
          return scale.domain(d3_scale_nice(scale.domain(), function() {
            return m;
          }));
        };
        scale.ticks = function(m, k) {
          var extent = d3_time_scaleExtent(scale.domain());
          if (typeof m !== "function") {
            var span = extent[1] - extent[0], target = span / m, i = d3.bisect(d3_time_scaleSteps, target);
            if (i == d3_time_scaleSteps.length) return methods.year(extent, m);
            if (!i) return linear.ticks(m).map(d3_time_scaleDate);
            if (Math.log(target / d3_time_scaleSteps[i - 1]) < Math.log(d3_time_scaleSteps[i] / target)) --i;
            m = methods[i];
            k = m[1];
            m = m[0].range;
          }
          return m(extent[0], new Date(+extent[1] + 1), k);
        };
        scale.tickFormat = function() {
          return format;
        };
        scale.copy = function() {
          return d3_time_scale(linear.copy(), methods, format);
        };
        return d3.rebind(scale, linear, "range", "rangeRound", "interpolate", "clamp");
      }
      function d3_time_scaleExtent(domain) {
        var start = domain[0], stop = domain[domain.length - 1];
        return start < stop ? [ start, stop ] : [ stop, start ];
      }
      function d3_time_scaleDate(t) {
        return new Date(t);
      }
      function d3_time_scaleFormat(formats) {
        return function(date) {
          var i = formats.length - 1, f = formats[i];
          while (!f[1](date)) f = formats[--i];
          return f[0](date);
        };
      }
      function d3_time_scaleSetYear(y) {
        var d = new Date(y, 0, 1);
        d.setFullYear(y);
        return d;
      }
      function d3_time_scaleGetYear(d) {
        var y = d.getFullYear(), d0 = d3_time_scaleSetYear(y), d1 = d3_time_scaleSetYear(y + 1);
        return y + (d - d0) / (d1 - d0);
      }
      function d3_time_scaleUTCSetYear(y) {
        var d = new Date(Date.UTC(y, 0, 1));
        d.setUTCFullYear(y);
        return d;
      }
      function d3_time_scaleUTCGetYear(d) {
        var y = d.getUTCFullYear(), d0 = d3_time_scaleUTCSetYear(y), d1 = d3_time_scaleUTCSetYear(y + 1);
        return y + (d - d0) / (d1 - d0);
      }
      if (!Date.now) Date.now = function() {
        return +(new Date);
      };
      try {
        document.createElement("div").style.setProperty("opacity", 0, "");
      } catch (error) {
        var d3_style_prototype = CSSStyleDeclaration.prototype, d3_style_setProperty = d3_style_prototype.setProperty;
        d3_style_prototype.setProperty = function(name, value, priority) {
          d3_style_setProperty.call(this, name, value + "", priority);
        };
      }
      d3 = {
        version: "2.10.3"
      };
      var d3_array = d3_arraySlice;
      try {
        d3_array(document.documentElement.childNodes)[0].nodeType;
      } catch (e) {
        d3_array = d3_arrayCopy;
      }
      var d3_arraySubclass = [].__proto__ ? function(array, prototype) {
        array.__proto__ = prototype;
      } : function(array, prototype) {
        for (var property in prototype) array[property] = prototype[property];
      };
      d3.map = function(object) {
        var map = new d3_Map;
        for (var key in object) map.set(key, object[key]);
        return map;
      };
      d3_class(d3_Map, {
        has: function(key) {
          return d3_map_prefix + key in this;
        },
        get: function(key) {
          return this[d3_map_prefix + key];
        },
        set: function(key, value) {
          return this[d3_map_prefix + key] = value;
        },
        remove: function(key) {
          key = d3_map_prefix + key;
          return key in this && delete this[key];
        },
        keys: function() {
          var keys = [];
          this.forEach(function(key) {
            keys.push(key);
          });
          return keys;
        },
        values: function() {
          var values = [];
          this.forEach(function(key, value) {
            values.push(value);
          });
          return values;
        },
        entries: function() {
          var entries = [];
          this.forEach(function(key, value) {
            entries.push({
              key: key,
              value: value
            });
          });
          return entries;
        },
        forEach: function(f) {
          for (var key in this) {
            if (key.charCodeAt(0) === d3_map_prefixCode) {
              f.call(this, key.substring(1), this[key]);
            }
          }
        }
      });
      var d3_map_prefix = "\0", d3_map_prefixCode = d3_map_prefix.charCodeAt(0);
      d3.functor = d3_functor;
      d3.rebind = function(target, source) {
        var i = 1, n = arguments.length, method;
        while (++i < n) target[method = arguments[i]] = d3_rebind(target, source, source[method]);
        return target;
      };
      d3.ascending = function(a, b) {
        return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;
      };
      d3.descending = function(a, b) {
        return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN;
      };
      d3.mean = function(array, f) {
        var n = array.length, a, m = 0, i = -1, j = 0;
        if (arguments.length === 1) {
          while (++i < n) if (d3_number(a = array[i])) m += (a - m) / ++j;
        } else {
          while (++i < n) if (d3_number(a = f.call(array, array[i], i))) m += (a - m) / ++j;
        }
        return j ? m : undefined;
      };
      d3.median = function(array, f) {
        if (arguments.length > 1) array = array.map(f);
        array = array.filter(d3_number);
        return array.length ? d3.quantile(array.sort(d3.ascending), .5) : undefined;
      };
      d3.min = function(array, f) {
        var i = -1, n = array.length, a, b;
        if (arguments.length === 1) {
          while (++i < n && ((a = array[i]) == null || a != a)) a = undefined;
          while (++i < n) if ((b = array[i]) != null && a > b) a = b;
        } else {
          while (++i < n && ((a = f.call(array, array[i], i)) == null || a != a)) a = undefined;
          while (++i < n) if ((b = f.call(array, array[i], i)) != null && a > b) a = b;
        }
        return a;
      };
      d3.max = function(array, f) {
        var i = -1, n = array.length, a, b;
        if (arguments.length === 1) {
          while (++i < n && ((a = array[i]) == null || a != a)) a = undefined;
          while (++i < n) if ((b = array[i]) != null && b > a) a = b;
        } else {
          while (++i < n && ((a = f.call(array, array[i], i)) == null || a != a)) a = undefined;
          while (++i < n) if ((b = f.call(array, array[i], i)) != null && b > a) a = b;
        }
        return a;
      };
      d3.extent = function(array, f) {
        var i = -1, n = array.length, a, b, c;
        if (arguments.length === 1) {
          while (++i < n && ((a = c = array[i]) == null || a != a)) a = c = undefined;
          while (++i < n) if ((b = array[i]) != null) {
            if (a > b) a = b;
            if (c < b) c = b;
          }
        } else {
          while (++i < n && ((a = c = f.call(array, array[i], i)) == null || a != a)) a = undefined;
          while (++i < n) if ((b = f.call(array, array[i], i)) != null) {
            if (a > b) a = b;
            if (c < b) c = b;
          }
        }
        return [ a, c ];
      };
      d3.random = {
        normal: function(µ, σ) {
          var n = arguments.length;
          if (n < 2) σ = 1;
          if (n < 1) µ = 0;
          return function() {
            var x, y, r;
            do {
              x = Math.random() * 2 - 1;
              y = Math.random() * 2 - 1;
              r = x * x + y * y;
            } while (!r || r > 1);
            return µ + σ * x * Math.sqrt(-2 * Math.log(r) / r);
          };
        },
        logNormal: function(µ, σ) {
          var n = arguments.length;
          if (n < 2) σ = 1;
          if (n < 1) µ = 0;
          var random = d3.random.normal();
          return function() {
            return Math.exp(µ + σ * random());
          };
        },
        irwinHall: function(m) {
          return function() {
            for (var s = 0, j = 0; j < m; j++) s += Math.random();
            return s / m;
          };
        }
      };
      d3.sum = function(array, f) {
        var s = 0, n = array.length, a, i = -1;
        if (arguments.length === 1) {
          while (++i < n) if (!isNaN(a = +array[i])) s += a;
        } else {
          while (++i < n) if (!isNaN(a = +f.call(array, array[i], i))) s += a;
        }
        return s;
      };
      d3.quantile = function(values, p) {
        var H = (values.length - 1) * p + 1, h = Math.floor(H), v = values[h - 1], e = H - h;
        return e ? v + e * (values[h] - v) : v;
      };
      d3.transpose = function(matrix) {
        return d3.zip.apply(d3, matrix);
      };
      d3.zip = function() {
        if (!(n = arguments.length)) return [];
        for (var i = -1, m = d3.min(arguments, d3_zipLength), zips = new Array(m); ++i < m; ) {
          for (var j = -1, n, zip = zips[i] = new Array(n); ++j < n; ) {
            zip[j] = arguments[j][i];
          }
        }
        return zips;
      };
      d3.bisector = function(f) {
        return {
          left: function(a, x, lo, hi) {
            if (arguments.length < 3) lo = 0;
            if (arguments.length < 4) hi = a.length;
            while (lo < hi) {
              var mid = lo + hi >>> 1;
              if (f.call(a, a[mid], mid) < x) lo = mid + 1; else hi = mid;
            }
            return lo;
          },
          right: function(a, x, lo, hi) {
            if (arguments.length < 3) lo = 0;
            if (arguments.length < 4) hi = a.length;
            while (lo < hi) {
              var mid = lo + hi >>> 1;
              if (x < f.call(a, a[mid], mid)) hi = mid; else lo = mid + 1;
            }
            return lo;
          }
        };
      };
      var d3_bisector = d3.bisector(function(d) {
        return d;
      });
      d3.bisectLeft = d3_bisector.left;
      d3.bisect = d3.bisectRight = d3_bisector.right;
      d3.first = function(array, f) {
        var i = 0, n = array.length, a = array[0], b;
        if (arguments.length === 1) f = d3.ascending;
        while (++i < n) {
          if (f.call(array, a, b = array[i]) > 0) {
            a = b;
          }
        }
        return a;
      };
      d3.last = function(array, f) {
        var i = 0, n = array.length, a = array[0], b;
        if (arguments.length === 1) f = d3.ascending;
        while (++i < n) {
          if (f.call(array, a, b = array[i]) <= 0) {
            a = b;
          }
        }
        return a;
      };
      d3.nest = function() {
        function map(array, depth) {
          if (depth >= keys.length) return rollup ? rollup.call(nest, array) : sortValues ? array.sort(sortValues) : array;
          var i = -1, n = array.length, key = keys[depth++], keyValue, object, valuesByKey = new d3_Map, values, o = {};
          while (++i < n) {
            if (values = valuesByKey.get(keyValue = key(object = array[i]))) {
              values.push(object);
            } else {
              valuesByKey.set(keyValue, [ object ]);
            }
          }
          valuesByKey.forEach(function(keyValue, values) {
            o[keyValue] = map(values, depth);
          });
          return o;
        }
        function entries(map, depth) {
          if (depth >= keys.length) return map;
          var a = [], sortKey = sortKeys[depth++], key;
          for (key in map) {
            a.push({
              key: key,
              values: entries(map[key], depth)
            });
          }
          if (sortKey) a.sort(function(a, b) {
            return sortKey(a.key, b.key);
          });
          return a;
        }
        var nest = {}, keys = [], sortKeys = [], sortValues, rollup;
        nest.map = function(array) {
          return map(array, 0);
        };
        nest.entries = function(array) {
          return entries(map(array, 0), 0);
        };
        nest.key = function(d) {
          keys.push(d);
          return nest;
        };
        nest.sortKeys = function(order) {
          sortKeys[keys.length - 1] = order;
          return nest;
        };
        nest.sortValues = function(order) {
          sortValues = order;
          return nest;
        };
        nest.rollup = function(f) {
          rollup = f;
          return nest;
        };
        return nest;
      };
      d3.keys = function(map) {
        var keys = [];
        for (var key in map) keys.push(key);
        return keys;
      };
      d3.values = function(map) {
        var values = [];
        for (var key in map) values.push(map[key]);
        return values;
      };
      d3.entries = function(map) {
        var entries = [];
        for (var key in map) entries.push({
          key: key,
          value: map[key]
        });
        return entries;
      };
      d3.permute = function(array, indexes) {
        var permutes = [], i = -1, n = indexes.length;
        while (++i < n) permutes[i] = array[indexes[i]];
        return permutes;
      };
      d3.merge = function(arrays) {
        return Array.prototype.concat.apply([], arrays);
      };
      d3.split = function(array, f) {
        var arrays = [], values = [], value, i = -1, n = array.length;
        if (arguments.length < 2) f = d3_splitter;
        while (++i < n) {
          if (f.call(values, value = array[i], i)) {
            values = [];
          } else {
            if (!values.length) arrays.push(values);
            values.push(value);
          }
        }
        return arrays;
      };
      d3.range = function(start, stop, step) {
        if (arguments.length < 3) {
          step = 1;
          if (arguments.length < 2) {
            stop = start;
            start = 0;
          }
        }
        if ((stop - start) / step === Infinity) throw new Error("infinite range");
        var range = [], k = d3_range_integerScale(Math.abs(step)), i = -1, j;
        start *= k, stop *= k, step *= k;
        if (step < 0) while ((j = start + step * ++i) > stop) range.push(j / k); else while ((j = start + step * ++i) < stop) range.push(j / k);
        return range;
      };
      d3.requote = function(s) {
        return s.replace(d3_requote_re, "\\$&");
      };
      var d3_requote_re = /[\\\^\$\*\+\?\|\[\]\(\)\.\{\}]/g;
      d3.round = function(x, n) {
        return n ? Math.round(x * (n = Math.pow(10, n))) / n : Math.round(x);
      };
      d3.xhr = function(url, mime, callback) {
        var req = new XMLHttpRequest;
        if (arguments.length < 3) callback = mime, mime = null; else if (mime && req.overrideMimeType) req.overrideMimeType(mime);
        req.open("GET", url, true);
        if (mime) req.setRequestHeader("Accept", mime);
        req.onreadystatechange = function() {
          if (req.readyState === 4) {
            var s = req.status;
            callback(!s && req.response || s >= 200 && s < 300 || s === 304 ? req : null);
          }
        };
        req.send(null);
      };
      d3.text = function(url, mime, callback) {
        function ready(req) {
          callback(req && req.responseText);
        }
        if (arguments.length < 3) {
          callback = mime;
          mime = null;
        }
        d3.xhr(url, mime, ready);
      };
      d3.json = function(url, callback) {
        d3.text(url, "application/json", function(text) {
          callback(text ? JSON.parse(text) : null);
        });
      };
      d3.html = function(url, callback) {
        d3.text(url, "text/html", function(text) {
          if (text != null) {
            var range = document.createRange();
            range.selectNode(document.body);
            text = range.createContextualFragment(text);
          }
          callback(text);
        });
      };
      d3.xml = function(url, mime, callback) {
        function ready(req) {
          callback(req && req.responseXML);
        }
        if (arguments.length < 3) {
          callback = mime;
          mime = null;
        }
        d3.xhr(url, mime, ready);
      };
      var d3_nsPrefix = {
        svg: "http://www.w3.org/2000/svg",
        xhtml: "http://www.w3.org/1999/xhtml",
        xlink: "http://www.w3.org/1999/xlink",
        xml: "http://www.w3.org/XML/1998/namespace",
        xmlns: "http://www.w3.org/2000/xmlns/"
      };
      d3.ns = {
        prefix: d3_nsPrefix,
        qualify: function(name) {
          var i = name.indexOf(":"), prefix = name;
          if (i >= 0) {
            prefix = name.substring(0, i);
            name = name.substring(i + 1);
          }
          return d3_nsPrefix.hasOwnProperty(prefix) ? {
            space: d3_nsPrefix[prefix],
            local: name
          } : name;
        }
      };
      d3.dispatch = function() {
        var dispatch = new d3_dispatch, i = -1, n = arguments.length;
        while (++i < n) dispatch[arguments[i]] = d3_dispatch_event(dispatch);
        return dispatch;
      };
      d3_dispatch.prototype.on = function(type, listener) {
        var i = type.indexOf("."), name = "";
        if (i > 0) {
          name = type.substring(i + 1);
          type = type.substring(0, i);
        }
        return arguments.length < 2 ? this[type].on(name) : this[type].on(name, listener);
      };
      d3.format = function(specifier) {
        var match = d3_format_re.exec(specifier), fill = match[1] || " ", sign = match[3] || "", zfill = match[5], width = +match[6], comma = match[7], precision = match[8], type = match[9], scale = 1, suffix = "", integer = false;
        if (precision) precision = +precision.substring(1);
        if (zfill) {
          fill = "0";
          if (comma) width -= Math.floor((width - 1) / 4);
        }
        switch (type) {
         case "n":
          comma = true;
          type = "g";
          break;
         case "%":
          scale = 100;
          suffix = "%";
          type = "f";
          break;
         case "p":
          scale = 100;
          suffix = "%";
          type = "r";
          break;
         case "d":
          integer = true;
          precision = 0;
          break;
         case "s":
          scale = -1;
          type = "r";
          break;
        }
        if (type == "r" && !precision) type = "g";
        type = d3_format_types.get(type) || d3_format_typeDefault;
        return function(value) {
          if (integer && value % 1) return "";
          var negative = value < 0 && (value = -value) ? "-" : sign;
          if (scale < 0) {
            var prefix = d3.formatPrefix(value, precision);
            value = prefix.scale(value);
            suffix = prefix.symbol;
          } else {
            value *= scale;
          }
          value = type(value, precision);
          if (zfill) {
            var length = value.length + negative.length;
            if (length < width) value = (new Array(width - length + 1)).join(fill) + value;
            if (comma) value = d3_format_group(value);
            value = negative + value;
          } else {
            if (comma) value = d3_format_group(value);
            value = negative + value;
            var length = value.length;
            if (length < width) value = (new Array(width - length + 1)).join(fill) + value;
          }
          return value + suffix;
        };
      };
      var d3_format_re = /(?:([^{])?([<>=^]))?([+\- ])?(#)?(0)?([0-9]+)?(,)?(\.[0-9]+)?([a-zA-Z%])?/;
      var d3_format_types = d3.map({
        g: function(x, p) {
          return x.toPrecision(p);
        },
        e: function(x, p) {
          return x.toExponential(p);
        },
        f: function(x, p) {
          return x.toFixed(p);
        },
        r: function(x, p) {
          return d3.round(x, p = d3_format_precision(x, p)).toFixed(Math.max(0, Math.min(20, p)));
        }
      });
      var d3_formatPrefixes = [ "y", "z", "a", "f", "p", "n", "μ", "m", "", "k", "M", "G", "T", "P", "E", "Z", "Y" ].map(d3_formatPrefix);
      d3.formatPrefix = function(value, precision) {
        var i = 0;
        if (value) {
          if (value < 0) value *= -1;
          if (precision) value = d3.round(value, d3_format_precision(value, precision));
          i = 1 + Math.floor(1e-12 + Math.log(value) / Math.LN10);
          i = Math.max(-24, Math.min(24, Math.floor((i <= 0 ? i + 1 : i - 1) / 3) * 3));
        }
        return d3_formatPrefixes[8 + i / 3];
      };
      var d3_ease_quad = d3_ease_poly(2), d3_ease_cubic = d3_ease_poly(3), d3_ease_default = function() {
        return d3_ease_identity;
      };
      var d3_ease = d3.map({
        linear: d3_ease_default,
        poly: d3_ease_poly,
        quad: function() {
          return d3_ease_quad;
        },
        cubic: function() {
          return d3_ease_cubic;
        },
        sin: function() {
          return d3_ease_sin;
        },
        exp: function() {
          return d3_ease_exp;
        },
        circle: function() {
          return d3_ease_circle;
        },
        elastic: d3_ease_elastic,
        back: d3_ease_back,
        bounce: function() {
          return d3_ease_bounce;
        }
      });
      var d3_ease_mode = d3.map({
        "in": d3_ease_identity,
        out: d3_ease_reverse,
        "in-out": d3_ease_reflect,
        "out-in": function(f) {
          return d3_ease_reflect(d3_ease_reverse(f));
        }
      });
      d3.ease = function(name) {
        var i = name.indexOf("-"), t = i >= 0 ? name.substring(0, i) : name, m = i >= 0 ? name.substring(i + 1) : "in";
        t = d3_ease.get(t) || d3_ease_default;
        m = d3_ease_mode.get(m) || d3_ease_identity;
        return d3_ease_clamp(m(t.apply(null, Array.prototype.slice.call(arguments, 1))));
      };
      d3.event = null;
      d3.transform = function(string) {
        var g = document.createElementNS(d3.ns.prefix.svg, "g");
        return (d3.transform = function(string) {
          g.setAttribute("transform", string);
          var t = g.transform.baseVal.consolidate();
          return new d3_transform(t ? t.matrix : d3_transformIdentity);
        })(string);
      };
      d3_transform.prototype.toString = function() {
        return "translate(" + this.translate + ")rotate(" + this.rotate + ")skewX(" + this.skew + ")scale(" + this.scale + ")";
      };
      var d3_transformDegrees = 180 / Math.PI, d3_transformIdentity = {
        a: 1,
        b: 0,
        c: 0,
        d: 1,
        e: 0,
        f: 0
      };
      d3.interpolate = function(a, b) {
        var i = d3.interpolators.length, f;
        while (--i >= 0 && !(f = d3.interpolators[i](a, b))) ;
        return f;
      };
      d3.interpolateNumber = function(a, b) {
        b -= a;
        return function(t) {
          return a + b * t;
        };
      };
      d3.interpolateRound = function(a, b) {
        b -= a;
        return function(t) {
          return Math.round(a + b * t);
        };
      };
      d3.interpolateString = function(a, b) {
        var m, i, j, s0 = 0, s1 = 0, s = [], q = [], n, o;
        d3_interpolate_number.lastIndex = 0;
        for (i = 0; m = d3_interpolate_number.exec(b); ++i) {
          if (m.index) s.push(b.substring(s0, s1 = m.index));
          q.push({
            i: s.length,
            x: m[0]
          });
          s.push(null);
          s0 = d3_interpolate_number.lastIndex;
        }
        if (s0 < b.length) s.push(b.substring(s0));
        for (i = 0, n = q.length; (m = d3_interpolate_number.exec(a)) && i < n; ++i) {
          o = q[i];
          if (o.x == m[0]) {
            if (o.i) {
              if (s[o.i + 1] == null) {
                s[o.i - 1] += o.x;
                s.splice(o.i, 1);
                for (j = i + 1; j < n; ++j) q[j].i--;
              } else {
                s[o.i - 1] += o.x + s[o.i + 1];
                s.splice(o.i, 2);
                for (j = i + 1; j < n; ++j) q[j].i -= 2;
              }
            } else {
              if (s[o.i + 1] == null) {
                s[o.i] = o.x;
              } else {
                s[o.i] = o.x + s[o.i + 1];
                s.splice(o.i + 1, 1);
                for (j = i + 1; j < n; ++j) q[j].i--;
              }
            }
            q.splice(i, 1);
            n--;
            i--;
          } else {
            o.x = d3.interpolateNumber(parseFloat(m[0]), parseFloat(o.x));
          }
        }
        while (i < n) {
          o = q.pop();
          if (s[o.i + 1] == null) {
            s[o.i] = o.x;
          } else {
            s[o.i] = o.x + s[o.i + 1];
            s.splice(o.i + 1, 1);
          }
          n--;
        }
        if (s.length === 1) {
          return s[0] == null ? q[0].x : function() {
            return b;
          };
        }
        return function(t) {
          for (i = 0; i < n; ++i) s[(o = q[i]).i] = o.x(t);
          return s.join("");
        };
      };
      d3.interpolateTransform = function(a, b) {
        var s = [], q = [], n, A = d3.transform(a), B = d3.transform(b), ta = A.translate, tb = B.translate, ra = A.rotate, rb = B.rotate, wa = A.skew, wb = B.skew, ka = A.scale, kb = B.scale;
        if (ta[0] != tb[0] || ta[1] != tb[1]) {
          s.push("translate(", null, ",", null, ")");
          q.push({
            i: 1,
            x: d3.interpolateNumber(ta[0], tb[0])
          }, {
            i: 3,
            x: d3.interpolateNumber(ta[1], tb[1])
          });
        } else if (tb[0] || tb[1]) {
          s.push("translate(" + tb + ")");
        } else {
          s.push("");
        }
        if (ra != rb) {
          if (ra - rb > 180) rb += 360; else if (rb - ra > 180) ra += 360;
          q.push({
            i: s.push(s.pop() + "rotate(", null, ")") - 2,
            x: d3.interpolateNumber(ra, rb)
          });
        } else if (rb) {
          s.push(s.pop() + "rotate(" + rb + ")");
        }
        if (wa != wb) {
          q.push({
            i: s.push(s.pop() + "skewX(", null, ")") - 2,
            x: d3.interpolateNumber(wa, wb)
          });
        } else if (wb) {
          s.push(s.pop() + "skewX(" + wb + ")");
        }
        if (ka[0] != kb[0] || ka[1] != kb[1]) {
          n = s.push(s.pop() + "scale(", null, ",", null, ")");
          q.push({
            i: n - 4,
            x: d3.interpolateNumber(ka[0], kb[0])
          }, {
            i: n - 2,
            x: d3.interpolateNumber(ka[1], kb[1])
          });
        } else if (kb[0] != 1 || kb[1] != 1) {
          s.push(s.pop() + "scale(" + kb + ")");
        }
        n = q.length;
        return function(t) {
          var i = -1, o;
          while (++i < n) s[(o = q[i]).i] = o.x(t);
          return s.join("");
        };
      };
      d3.interpolateRgb = function(a, b) {
        a = d3.rgb(a);
        b = d3.rgb(b);
        var ar = a.r, ag = a.g, ab = a.b, br = b.r - ar, bg = b.g - ag, bb = b.b - ab;
        return function(t) {
          return "#" + d3_rgb_hex(Math.round(ar + br * t)) + d3_rgb_hex(Math.round(ag + bg * t)) + d3_rgb_hex(Math.round(ab + bb * t));
        };
      };
      d3.interpolateHsl = function(a, b) {
        a = d3.hsl(a);
        b = d3.hsl(b);
        var h0 = a.h, s0 = a.s, l0 = a.l, h1 = b.h - h0, s1 = b.s - s0, l1 = b.l - l0;
        if (h1 > 180) h1 -= 360; else if (h1 < -180) h1 += 360;
        return function(t) {
          return d3_hsl_rgb(h0 + h1 * t, s0 + s1 * t, l0 + l1 * t) + "";
        };
      };
      d3.interpolateLab = function(a, b) {
        a = d3.lab(a);
        b = d3.lab(b);
        var al = a.l, aa = a.a, ab = a.b, bl = b.l - al, ba = b.a - aa, bb = b.b - ab;
        return function(t) {
          return d3_lab_rgb(al + bl * t, aa + ba * t, ab + bb * t) + "";
        };
      };
      d3.interpolateHcl = function(a, b) {
        a = d3.hcl(a);
        b = d3.hcl(b);
        var ah = a.h, ac = a.c, al = a.l, bh = b.h - ah, bc = b.c - ac, bl = b.l - al;
        if (bh > 180) bh -= 360; else if (bh < -180) bh += 360;
        return function(t) {
          return d3_hcl_lab(ah + bh * t, ac + bc * t, al + bl * t) + "";
        };
      };
      d3.interpolateArray = function(a, b) {
        var x = [], c = [], na = a.length, nb = b.length, n0 = Math.min(a.length, b.length), i;
        for (i = 0; i < n0; ++i) x.push(d3.interpolate(a[i], b[i]));
        for (; i < na; ++i) c[i] = a[i];
        for (; i < nb; ++i) c[i] = b[i];
        return function(t) {
          for (i = 0; i < n0; ++i) c[i] = x[i](t);
          return c;
        };
      };
      d3.interpolateObject = function(a, b) {
        var i = {}, c = {}, k;
        for (k in a) {
          if (k in b) {
            i[k] = d3_interpolateByName(k)(a[k], b[k]);
          } else {
            c[k] = a[k];
          }
        }
        for (k in b) {
          if (!(k in a)) {
            c[k] = b[k];
          }
        }
        return function(t) {
          for (k in i) c[k] = i[k](t);
          return c;
        };
      };
      var d3_interpolate_number = /[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g;
      d3.interpolators = [ d3.interpolateObject, function(a, b) {
        return b instanceof Array && d3.interpolateArray(a, b);
      }, function(a, b) {
        return (typeof a === "string" || typeof b === "string") && d3.interpolateString(a + "", b + "");
      }, function(a, b) {
        return (typeof b === "string" ? d3_rgb_names.has(b) || /^(#|rgb\(|hsl\()/.test(b) : b instanceof d3_Color) && d3.interpolateRgb(a, b);
      }, function(a, b) {
        return !isNaN(a = +a) && !isNaN(b = +b) && d3.interpolateNumber(a, b);
      } ];
      d3_Color.prototype.toString = function() {
        return this.rgb() + "";
      };
      d3.rgb = function(r, g, b) {
        return arguments.length === 1 ? r instanceof d3_Rgb ? d3_rgb(r.r, r.g, r.b) : d3_rgb_parse("" + r, d3_rgb, d3_hsl_rgb) : d3_rgb(~~r, ~~g, ~~b);
      };
      var d3_rgbPrototype = d3_Rgb.prototype = new d3_Color;
      d3_rgbPrototype.brighter = function(k) {
        k = Math.pow(.7, arguments.length ? k : 1);
        var r = this.r, g = this.g, b = this.b, i = 30;
        if (!r && !g && !b) return d3_rgb(i, i, i);
        if (r && r < i) r = i;
        if (g && g < i) g = i;
        if (b && b < i) b = i;
        return d3_rgb(Math.min(255, Math.floor(r / k)), Math.min(255, Math.floor(g / k)), Math.min(255, Math.floor(b / k)));
      };
      d3_rgbPrototype.darker = function(k) {
        k = Math.pow(.7, arguments.length ? k : 1);
        return d3_rgb(Math.floor(k * this.r), Math.floor(k * this.g), Math.floor(k * this.b));
      };
      d3_rgbPrototype.hsl = function() {
        return d3_rgb_hsl(this.r, this.g, this.b);
      };
      d3_rgbPrototype.toString = function() {
        return "#" + d3_rgb_hex(this.r) + d3_rgb_hex(this.g) + d3_rgb_hex(this.b);
      };
      var d3_rgb_names = d3.map({
        aliceblue: "#f0f8ff",
        antiquewhite: "#faebd7",
        aqua: "#00ffff",
        aquamarine: "#7fffd4",
        azure: "#f0ffff",
        beige: "#f5f5dc",
        bisque: "#ffe4c4",
        black: "#000000",
        blanchedalmond: "#ffebcd",
        blue: "#0000ff",
        blueviolet: "#8a2be2",
        brown: "#a52a2a",
        burlywood: "#deb887",
        cadetblue: "#5f9ea0",
        chartreuse: "#7fff00",
        chocolate: "#d2691e",
        coral: "#ff7f50",
        cornflowerblue: "#6495ed",
        cornsilk: "#fff8dc",
        crimson: "#dc143c",
        cyan: "#00ffff",
        darkblue: "#00008b",
        darkcyan: "#008b8b",
        darkgoldenrod: "#b8860b",
        darkgray: "#a9a9a9",
        darkgreen: "#006400",
        darkgrey: "#a9a9a9",
        darkkhaki: "#bdb76b",
        darkmagenta: "#8b008b",
        darkolivegreen: "#556b2f",
        darkorange: "#ff8c00",
        darkorchid: "#9932cc",
        darkred: "#8b0000",
        darksalmon: "#e9967a",
        darkseagreen: "#8fbc8f",
        darkslateblue: "#483d8b",
        darkslategray: "#2f4f4f",
        darkslategrey: "#2f4f4f",
        darkturquoise: "#00ced1",
        darkviolet: "#9400d3",
        deeppink: "#ff1493",
        deepskyblue: "#00bfff",
        dimgray: "#696969",
        dimgrey: "#696969",
        dodgerblue: "#1e90ff",
        firebrick: "#b22222",
        floralwhite: "#fffaf0",
        forestgreen: "#228b22",
        fuchsia: "#ff00ff",
        gainsboro: "#dcdcdc",
        ghostwhite: "#f8f8ff",
        gold: "#ffd700",
        goldenrod: "#daa520",
        gray: "#808080",
        green: "#008000",
        greenyellow: "#adff2f",
        grey: "#808080",
        honeydew: "#f0fff0",
        hotpink: "#ff69b4",
        indianred: "#cd5c5c",
        indigo: "#4b0082",
        ivory: "#fffff0",
        khaki: "#f0e68c",
        lavender: "#e6e6fa",
        lavenderblush: "#fff0f5",
        lawngreen: "#7cfc00",
        lemonchiffon: "#fffacd",
        lightblue: "#add8e6",
        lightcoral: "#f08080",
        lightcyan: "#e0ffff",
        lightgoldenrodyellow: "#fafad2",
        lightgray: "#d3d3d3",
        lightgreen: "#90ee90",
        lightgrey: "#d3d3d3",
        lightpink: "#ffb6c1",
        lightsalmon: "#ffa07a",
        lightseagreen: "#20b2aa",
        lightskyblue: "#87cefa",
        lightslategray: "#778899",
        lightslategrey: "#778899",
        lightsteelblue: "#b0c4de",
        lightyellow: "#ffffe0",
        lime: "#00ff00",
        limegreen: "#32cd32",
        linen: "#faf0e6",
        magenta: "#ff00ff",
        maroon: "#800000",
        mediumaquamarine: "#66cdaa",
        mediumblue: "#0000cd",
        mediumorchid: "#ba55d3",
        mediumpurple: "#9370db",
        mediumseagreen: "#3cb371",
        mediumslateblue: "#7b68ee",
        mediumspringgreen: "#00fa9a",
        mediumturquoise: "#48d1cc",
        mediumvioletred: "#c71585",
        midnightblue: "#191970",
        mintcream: "#f5fffa",
        mistyrose: "#ffe4e1",
        moccasin: "#ffe4b5",
        navajowhite: "#ffdead",
        navy: "#000080",
        oldlace: "#fdf5e6",
        olive: "#808000",
        olivedrab: "#6b8e23",
        orange: "#ffa500",
        orangered: "#ff4500",
        orchid: "#da70d6",
        palegoldenrod: "#eee8aa",
        palegreen: "#98fb98",
        paleturquoise: "#afeeee",
        palevioletred: "#db7093",
        papayawhip: "#ffefd5",
        peachpuff: "#ffdab9",
        peru: "#cd853f",
        pink: "#ffc0cb",
        plum: "#dda0dd",
        powderblue: "#b0e0e6",
        purple: "#800080",
        red: "#ff0000",
        rosybrown: "#bc8f8f",
        royalblue: "#4169e1",
        saddlebrown: "#8b4513",
        salmon: "#fa8072",
        sandybrown: "#f4a460",
        seagreen: "#2e8b57",
        seashell: "#fff5ee",
        sienna: "#a0522d",
        silver: "#c0c0c0",
        skyblue: "#87ceeb",
        slateblue: "#6a5acd",
        slategray: "#708090",
        slategrey: "#708090",
        snow: "#fffafa",
        springgreen: "#00ff7f",
        steelblue: "#4682b4",
        tan: "#d2b48c",
        teal: "#008080",
        thistle: "#d8bfd8",
        tomato: "#ff6347",
        turquoise: "#40e0d0",
        violet: "#ee82ee",
        wheat: "#f5deb3",
        white: "#ffffff",
        whitesmoke: "#f5f5f5",
        yellow: "#ffff00",
        yellowgreen: "#9acd32"
      });
      d3_rgb_names.forEach(function(key, value) {
        d3_rgb_names.set(key, d3_rgb_parse(value, d3_rgb, d3_hsl_rgb));
      });
      d3.hsl = function(h, s, l) {
        return arguments.length === 1 ? h instanceof d3_Hsl ? d3_hsl(h.h, h.s, h.l) : d3_rgb_parse("" + h, d3_rgb_hsl, d3_hsl) : d3_hsl(+h, +s, +l);
      };
      var d3_hslPrototype = d3_Hsl.prototype = new d3_Color;
      d3_hslPrototype.brighter = function(k) {
        k = Math.pow(.7, arguments.length ? k : 1);
        return d3_hsl(this.h, this.s, this.l / k);
      };
      d3_hslPrototype.darker = function(k) {
        k = Math.pow(.7, arguments.length ? k : 1);
        return d3_hsl(this.h, this.s, k * this.l);
      };
      d3_hslPrototype.rgb = function() {
        return d3_hsl_rgb(this.h, this.s, this.l);
      };
      d3.hcl = function(h, c, l) {
        return arguments.length === 1 ? h instanceof d3_Hcl ? d3_hcl(h.h, h.c, h.l) : h instanceof d3_Lab ? d3_lab_hcl(h.l, h.a, h.b) : d3_lab_hcl((h = d3_rgb_lab((h = d3.rgb(h)).r, h.g, h.b)).l, h.a, h.b) : d3_hcl(+h, +c, +l);
      };
      var d3_hclPrototype = d3_Hcl.prototype = new d3_Color;
      d3_hclPrototype.brighter = function(k) {
        return d3_hcl(this.h, this.c, Math.min(100, this.l + d3_lab_K * (arguments.length ? k : 1)));
      };
      d3_hclPrototype.darker = function(k) {
        return d3_hcl(this.h, this.c, Math.max(0, this.l - d3_lab_K * (arguments.length ? k : 1)));
      };
      d3_hclPrototype.rgb = function() {
        return d3_hcl_lab(this.h, this.c, this.l).rgb();
      };
      d3.lab = function(l, a, b) {
        return arguments.length === 1 ? l instanceof d3_Lab ? d3_lab(l.l, l.a, l.b) : l instanceof d3_Hcl ? d3_hcl_lab(l.l, l.c, l.h) : d3_rgb_lab((l = d3.rgb(l)).r, l.g, l.b) : d3_lab(+l, +a, +b);
      };
      var d3_lab_K = 18;
      var d3_lab_X = .95047, d3_lab_Y = 1, d3_lab_Z = 1.08883;
      var d3_labPrototype = d3_Lab.prototype = new d3_Color;
      d3_labPrototype.brighter = function(k) {
        return d3_lab(Math.min(100, this.l + d3_lab_K * (arguments.length ? k : 1)), this.a, this.b);
      };
      d3_labPrototype.darker = function(k) {
        return d3_lab(Math.max(0, this.l - d3_lab_K * (arguments.length ? k : 1)), this.a, this.b);
      };
      d3_labPrototype.rgb = function() {
        return d3_lab_rgb(this.l, this.a, this.b);
      };
      var d3_select = function(s, n) {
        return n.querySelector(s);
      }, d3_selectAll = function(s, n) {
        return n.querySelectorAll(s);
      }, d3_selectRoot = document.documentElement, d3_selectMatcher = d3_selectRoot.matchesSelector || d3_selectRoot.webkitMatchesSelector || d3_selectRoot.mozMatchesSelector || d3_selectRoot.msMatchesSelector || d3_selectRoot.oMatchesSelector, d3_selectMatches = function(n, s) {
        return d3_selectMatcher.call(n, s);
      };
      if (typeof Sizzle === "function") {
        d3_select = function(s, n) {
          return Sizzle(s, n)[0] || null;
        };
        d3_selectAll = function(s, n) {
          return Sizzle.uniqueSort(Sizzle(s, n));
        };
        d3_selectMatches = Sizzle.matchesSelector;
      }
      var d3_selectionPrototype = [];
      d3.selection = function() {
        return d3_selectionRoot;
      };
      d3.selection.prototype = d3_selectionPrototype;
      d3_selectionPrototype.select = function(selector) {
        var subgroups = [], subgroup, subnode, group, node;
        if (typeof selector !== "function") selector = d3_selection_selector(selector);
        for (var j = -1, m = this.length; ++j < m; ) {
          subgroups.push(subgroup = []);
          subgroup.parentNode = (group = this[j]).parentNode;
          for (var i = -1, n = group.length; ++i < n; ) {
            if (node = group[i]) {
              subgroup.push(subnode = selector.call(node, node.__data__, i));
              if (subnode && "__data__" in node) subnode.__data__ = node.__data__;
            } else {
              subgroup.push(null);
            }
          }
        }
        return d3_selection(subgroups);
      };
      d3_selectionPrototype.selectAll = function(selector) {
        var subgroups = [], subgroup, node;
        if (typeof selector !== "function") selector = d3_selection_selectorAll(selector);
        for (var j = -1, m = this.length; ++j < m; ) {
          for (var group = this[j], i = -1, n = group.length; ++i < n; ) {
            if (node = group[i]) {
              subgroups.push(subgroup = d3_array(selector.call(node, node.__data__, i)));
              subgroup.parentNode = node;
            }
          }
        }
        return d3_selection(subgroups);
      };
      d3_selectionPrototype.attr = function(name, value) {
        if (arguments.length < 2) {
          if (typeof name === "string") {
            var node = this.node();
            name = d3.ns.qualify(name);
            return name.local ? node.getAttributeNS(name.space, name.local) : node.getAttribute(name);
          }
          for (value in name) this.each(d3_selection_attr(value, name[value]));
          return this;
        }
        return this.each(d3_selection_attr(name, value));
      };
      d3_selectionPrototype.classed = function(name, value) {
        if (arguments.length < 2) {
          if (typeof name === "string") {
            var node = this.node(), n = (name = name.trim().split(/^|\s+/g)).length, i = -1;
            if (value = node.classList) {
              while (++i < n) if (!value.contains(name[i])) return false;
            } else {
              value = node.className;
              if (value.baseVal != null) value = value.baseVal;
              while (++i < n) if (!d3_selection_classedRe(name[i]).test(value)) return false;
            }
            return true;
          }
          for (value in name) this.each(d3_selection_classed(value, name[value]));
          return this;
        }
        return this.each(d3_selection_classed(name, value));
      };
      d3_selectionPrototype.style = function(name, value, priority) {
        var n = arguments.length;
        if (n < 3) {
          if (typeof name !== "string") {
            if (n < 2) value = "";
            for (priority in name) this.each(d3_selection_style(priority, name[priority], value));
            return this;
          }
          if (n < 2) return window.getComputedStyle(this.node(), null).getPropertyValue(name);
          priority = "";
        }
        return this.each(d3_selection_style(name, value, priority));
      };
      d3_selectionPrototype.property = function(name, value) {
        if (arguments.length < 2) {
          if (typeof name === "string") return this.node()[name];
          for (value in name) this.each(d3_selection_property(value, name[value]));
          return this;
        }
        return this.each(d3_selection_property(name, value));
      };
      d3_selectionPrototype.text = function(value) {
        return arguments.length < 1 ? this.node().textContent : this.each(typeof value === "function" ? function() {
          var v = value.apply(this, arguments);
          this.textContent = v == null ? "" : v;
        } : value == null ? function() {
          this.textContent = "";
        } : function() {
          this.textContent = value;
        });
      };
      d3_selectionPrototype.html = function(value) {
        return arguments.length < 1 ? this.node().innerHTML : this.each(typeof value === "function" ? function() {
          var v = value.apply(this, arguments);
          this.innerHTML = v == null ? "" : v;
        } : value == null ? function() {
          this.innerHTML = "";
        } : function() {
          this.innerHTML = value;
        });
      };
      d3_selectionPrototype.append = function(name) {
        function append() {
          return this.appendChild(document.createElementNS(this.namespaceURI, name));
        }
        function appendNS() {
          return this.appendChild(document.createElementNS(name.space, name.local));
        }
        name = d3.ns.qualify(name);
        return this.select(name.local ? appendNS : append);
      };
      d3_selectionPrototype.insert = function(name, before) {
        function insert() {
          return this.insertBefore(document.createElementNS(this.namespaceURI, name), d3_select(before, this));
        }
        function insertNS() {
          return this.insertBefore(document.createElementNS(name.space, name.local), d3_select(before, this));
        }
        name = d3.ns.qualify(name);
        return this.select(name.local ? insertNS : insert);
      };
      d3_selectionPrototype.remove = function() {
        return this.each(function() {
          var parent = this.parentNode;
          if (parent) parent.removeChild(this);
        });
      };
      d3_selectionPrototype.data = function(value, key) {
        function bind(group, groupData) {
          var i, n = group.length, m = groupData.length, n0 = Math.min(n, m), n1 = Math.max(n, m), updateNodes = [], enterNodes = [], exitNodes = [], node, nodeData;
          if (key) {
            var nodeByKeyValue = new d3_Map, keyValues = [], keyValue, j = groupData.length;
            for (i = -1; ++i < n; ) {
              keyValue = key.call(node = group[i], node.__data__, i);
              if (nodeByKeyValue.has(keyValue)) {
                exitNodes[j++] = node;
              } else {
                nodeByKeyValue.set(keyValue, node);
              }
              keyValues.push(keyValue);
            }
            for (i = -1; ++i < m; ) {
              keyValue = key.call(groupData, nodeData = groupData[i], i);
              if (nodeByKeyValue.has(keyValue)) {
                updateNodes[i] = node = nodeByKeyValue.get(keyValue);
                node.__data__ = nodeData;
                enterNodes[i] = exitNodes[i] = null;
              } else {
                enterNodes[i] = d3_selection_dataNode(nodeData);
                updateNodes[i] = exitNodes[i] = null;
              }
              nodeByKeyValue.remove(keyValue);
            }
            for (i = -1; ++i < n; ) {
              if (nodeByKeyValue.has(keyValues[i])) {
                exitNodes[i] = group[i];
              }
            }
          } else {
            for (i = -1; ++i < n0; ) {
              node = group[i];
              nodeData = groupData[i];
              if (node) {
                node.__data__ = nodeData;
                updateNodes[i] = node;
                enterNodes[i] = exitNodes[i] = null;
              } else {
                enterNodes[i] = d3_selection_dataNode(nodeData);
                updateNodes[i] = exitNodes[i] = null;
              }
            }
            for (; i < m; ++i) {
              enterNodes[i] = d3_selection_dataNode(groupData[i]);
              updateNodes[i] = exitNodes[i] = null;
            }
            for (; i < n1; ++i) {
              exitNodes[i] = group[i];
              enterNodes[i] = updateNodes[i] = null;
            }
          }
          enterNodes.update = updateNodes;
          enterNodes.parentNode = updateNodes.parentNode = exitNodes.parentNode = group.parentNode;
          enter.push(enterNodes);
          update.push(updateNodes);
          exit.push(exitNodes);
        }
        var i = -1, n = this.length, group, node;
        if (!arguments.length) {
          value = new Array(n = (group = this[0]).length);
          while (++i < n) {
            if (node = group[i]) {
              value[i] = node.__data__;
            }
          }
          return value;
        }
        var enter = d3_selection_enter([]), update = d3_selection([]), exit = d3_selection([]);
        if (typeof value === "function") {
          while (++i < n) {
            bind(group = this[i], value.call(group, group.parentNode.__data__, i));
          }
        } else {
          while (++i < n) {
            bind(group = this[i], value);
          }
        }
        update.enter = function() {
          return enter;
        };
        update.exit = function() {
          return exit;
        };
        return update;
      };
      d3_selectionPrototype.datum = d3_selectionPrototype.map = function(value) {
        return arguments.length < 1 ? this.property("__data__") : this.property("__data__", value);
      };
      d3_selectionPrototype.filter = function(filter) {
        var subgroups = [], subgroup, group, node;
        if (typeof filter !== "function") filter = d3_selection_filter(filter);
        for (var j = 0, m = this.length; j < m; j++) {
          subgroups.push(subgroup = []);
          subgroup.parentNode = (group = this[j]).parentNode;
          for (var i = 0, n = group.length; i < n; i++) {
            if ((node = group[i]) && filter.call(node, node.__data__, i)) {
              subgroup.push(node);
            }
          }
        }
        return d3_selection(subgroups);
      };
      d3_selectionPrototype.order = function() {
        for (var j = -1, m = this.length; ++j < m; ) {
          for (var group = this[j], i = group.length - 1, next = group[i], node; --i >= 0; ) {
            if (node = group[i]) {
              if (next && next !== node.nextSibling) next.parentNode.insertBefore(node, next);
              next = node;
            }
          }
        }
        return this;
      };
      d3_selectionPrototype.sort = function(comparator) {
        comparator = d3_selection_sortComparator.apply(this, arguments);
        for (var j = -1, m = this.length; ++j < m; ) this[j].sort(comparator);
        return this.order();
      };
      d3_selectionPrototype.on = function(type, listener, capture) {
        var n = arguments.length;
        if (n < 3) {
          if (typeof type !== "string") {
            if (n < 2) listener = false;
            for (capture in type) this.each(d3_selection_on(capture, type[capture], listener));
            return this;
          }
          if (n < 2) return (n = this.node()["__on" + type]) && n._;
          capture = false;
        }
        return this.each(d3_selection_on(type, listener, capture));
      };
      d3_selectionPrototype.each = function(callback) {
        return d3_selection_each(this, function(node, i, j) {
          callback.call(node, node.__data__, i, j);
        });
      };
      d3_selectionPrototype.call = function(callback) {
        callback.apply(this, (arguments[0] = this, arguments));
        return this;
      };
      d3_selectionPrototype.empty = function() {
        return !this.node();
      };
      d3_selectionPrototype.node = function(callback) {
        for (var j = 0, m = this.length; j < m; j++) {
          for (var group = this[j], i = 0, n = group.length; i < n; i++) {
            var node = group[i];
            if (node) return node;
          }
        }
        return null;
      };
      d3_selectionPrototype.transition = function() {
        var subgroups = [], subgroup, node;
        for (var j = -1, m = this.length; ++j < m; ) {
          subgroups.push(subgroup = []);
          for (var group = this[j], i = -1, n = group.length; ++i < n; ) {
            subgroup.push((node = group[i]) ? {
              node: node,
              delay: d3_transitionDelay,
              duration: d3_transitionDuration
            } : null);
          }
        }
        return d3_transition(subgroups, d3_transitionId || ++d3_transitionNextId, Date.now());
      };
      var d3_selectionRoot = d3_selection([ [ document ] ]);
      d3_selectionRoot[0].parentNode = d3_selectRoot;
      d3.select = function(selector) {
        return typeof selector === "string" ? d3_selectionRoot.select(selector) : d3_selection([ [ selector ] ]);
      };
      d3.selectAll = function(selector) {
        return typeof selector === "string" ? d3_selectionRoot.selectAll(selector) : d3_selection([ d3_array(selector) ]);
      };
      var d3_selection_enterPrototype = [];
      d3.selection.enter = d3_selection_enter;
      d3.selection.enter.prototype = d3_selection_enterPrototype;
      d3_selection_enterPrototype.append = d3_selectionPrototype.append;
      d3_selection_enterPrototype.insert = d3_selectionPrototype.insert;
      d3_selection_enterPrototype.empty = d3_selectionPrototype.empty;
      d3_selection_enterPrototype.node = d3_selectionPrototype.node;
      d3_selection_enterPrototype.select = function(selector) {
        var subgroups = [], subgroup, subnode, upgroup, group, node;
        for (var j = -1, m = this.length; ++j < m; ) {
          upgroup = (group = this[j]).update;
          subgroups.push(subgroup = []);
          subgroup.parentNode = group.parentNode;
          for (var i = -1, n = group.length; ++i < n; ) {
            if (node = group[i]) {
              subgroup.push(upgroup[i] = subnode = selector.call(group.parentNode, node.__data__, i));
              subnode.__data__ = node.__data__;
            } else {
              subgroup.push(null);
            }
          }
        }
        return d3_selection(subgroups);
      };
      var d3_transitionPrototype = [], d3_transitionNextId = 0, d3_transitionId = 0, d3_transitionDefaultDelay = 0, d3_transitionDefaultDuration = 250, d3_transitionDefaultEase = d3.ease("cubic-in-out"), d3_transitionDelay = d3_transitionDefaultDelay, d3_transitionDuration = d3_transitionDefaultDuration, d3_transitionEase = d3_transitionDefaultEase;
      d3_transitionPrototype.call = d3_selectionPrototype.call;
      d3.transition = function(selection) {
        return arguments.length ? d3_transitionId ? selection.transition() : selection : d3_selectionRoot.transition();
      };
      d3.transition.prototype = d3_transitionPrototype;
      d3_transitionPrototype.select = function(selector) {
        var subgroups = [], subgroup, subnode, node;
        if (typeof selector !== "function") selector = d3_selection_selector(selector);
        for (var j = -1, m = this.length; ++j < m; ) {
          subgroups.push(subgroup = []);
          for (var group = this[j], i = -1, n = group.length; ++i < n; ) {
            if ((node = group[i]) && (subnode = selector.call(node.node, node.node.__data__, i))) {
              if ("__data__" in node.node) subnode.__data__ = node.node.__data__;
              subgroup.push({
                node: subnode,
                delay: node.delay,
                duration: node.duration
              });
            } else {
              subgroup.push(null);
            }
          }
        }
        return d3_transition(subgroups, this.id, this.time).ease(this.ease());
      };
      d3_transitionPrototype.selectAll = function(selector) {
        var subgroups = [], subgroup, subnodes, node;
        if (typeof selector !== "function") selector = d3_selection_selectorAll(selector);
        for (var j = -1, m = this.length; ++j < m; ) {
          for (var group = this[j], i = -1, n = group.length; ++i < n; ) {
            if (node = group[i]) {
              subnodes = selector.call(node.node, node.node.__data__, i);
              subgroups.push(subgroup = []);
              for (var k = -1, o = subnodes.length; ++k < o; ) {
                subgroup.push({
                  node: subnodes[k],
                  delay: node.delay,
                  duration: node.duration
                });
              }
            }
          }
        }
        return d3_transition(subgroups, this.id, this.time).ease(this.ease());
      };
      d3_transitionPrototype.filter = function(filter) {
        var subgroups = [], subgroup, group, node;
        if (typeof filter !== "function") filter = d3_selection_filter(filter);
        for (var j = 0, m = this.length; j < m; j++) {
          subgroups.push(subgroup = []);
          for (var group = this[j], i = 0, n = group.length; i < n; i++) {
            if ((node = group[i]) && filter.call(node.node, node.node.__data__, i)) {
              subgroup.push(node);
            }
          }
        }
        return d3_transition(subgroups, this.id, this.time).ease(this.ease());
      };
      d3_transitionPrototype.attr = function(name, value) {
        if (arguments.length < 2) {
          for (value in name) this.attrTween(value, d3_tweenByName(name[value], value));
          return this;
        }
        return this.attrTween(name, d3_tweenByName(value, name));
      };
      d3_transitionPrototype.attrTween = function(nameNS, tween) {
        function attrTween(d, i) {
          var f = tween.call(this, d, i, this.getAttribute(name));
          return f === d3_tweenRemove ? (this.removeAttribute(name), null) : f && function(t) {
            this.setAttribute(name, f(t));
          };
        }
        function attrTweenNS(d, i) {
          var f = tween.call(this, d, i, this.getAttributeNS(name.space, name.local));
          return f === d3_tweenRemove ? (this.removeAttributeNS(name.space, name.local), null) : f && function(t) {
            this.setAttributeNS(name.space, name.local, f(t));
          };
        }
        var name = d3.ns.qualify(nameNS);
        return this.tween("attr." + nameNS, name.local ? attrTweenNS : attrTween);
      };
      d3_transitionPrototype.style = function(name, value, priority) {
        var n = arguments.length;
        if (n < 3) {
          if (typeof name !== "string") {
            if (n < 2) value = "";
            for (priority in name) this.styleTween(priority, d3_tweenByName(name[priority], priority), value);
            return this;
          }
          priority = "";
        }
        return this.styleTween(name, d3_tweenByName(value, name), priority);
      };
      d3_transitionPrototype.styleTween = function(name, tween, priority) {
        if (arguments.length < 3) priority = "";
        return this.tween("style." + name, function(d, i) {
          var f = tween.call(this, d, i, window.getComputedStyle(this, null).getPropertyValue(name));
          return f === d3_tweenRemove ? (this.style.removeProperty(name), null) : f && function(t) {
            this.style.setProperty(name, f(t), priority);
          };
        });
      };
      d3_transitionPrototype.text = function(value) {
        return this.tween("text", function(d, i) {
          this.textContent = typeof value === "function" ? value.call(this, d, i) : value;
        });
      };
      d3_transitionPrototype.remove = function() {
        return this.each("end.transition", function() {
          var p;
          if (!this.__transition__ && (p = this.parentNode)) p.removeChild(this);
        });
      };
      d3_transitionPrototype.delay = function(value) {
        return d3_selection_each(this, typeof value === "function" ? function(node, i, j) {
          node.delay = value.call(node = node.node, node.__data__, i, j) | 0;
        } : (value = value | 0, function(node) {
          node.delay = value;
        }));
      };
      d3_transitionPrototype.duration = function(value) {
        return d3_selection_each(this, typeof value === "function" ? function(node, i, j) {
          node.duration = Math.max(1, value.call(node = node.node, node.__data__, i, j) | 0);
        } : (value = Math.max(1, value | 0), function(node) {
          node.duration = value;
        }));
      };
      d3_transitionPrototype.transition = function() {
        return this.select(d3_this);
      };
      d3.tween = function(b, interpolate) {
        function tweenFunction(d, i, a) {
          var v = b.call(this, d, i);
          return v == null ? a != "" && d3_tweenRemove : a != v && interpolate(a, v + "");
        }
        function tweenString(d, i, a) {
          return a != b && interpolate(a, b);
        }
        return typeof b === "function" ? tweenFunction : b == null ? d3_tweenNull : (b += "", tweenString);
      };
      var d3_tweenRemove = {};
      var d3_timer_id = 0, d3_timer_byId = {}, d3_timer_queue = null, d3_timer_interval, d3_timer_timeout;
      d3.timer = function(callback, delay, then) {
        if (arguments.length < 3) {
          if (arguments.length < 2) delay = 0; else if (!isFinite(delay)) return;
          then = Date.now();
        }
        var timer = d3_timer_byId[callback.id];
        if (timer && timer.callback === callback) {
          timer.then = then;
          timer.delay = delay;
        } else d3_timer_byId[callback.id = ++d3_timer_id] = d3_timer_queue = {
          callback: callback,
          then: then,
          delay: delay,
          next: d3_timer_queue
        };
        if (!d3_timer_interval) {
          d3_timer_timeout = clearTimeout(d3_timer_timeout);
          d3_timer_interval = 1;
          d3_timer_frame(d3_timer_step);
        }
      };
      d3.timer.flush = function() {
        var elapsed, now = Date.now(), t1 = d3_timer_queue;
        while (t1) {
          elapsed = now - t1.then;
          if (!t1.delay) t1.flush = t1.callback(elapsed);
          t1 = t1.next;
        }
        d3_timer_flush();
      };
      var d3_timer_frame = window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame || function(callback) {
        setTimeout(callback, 17);
      };
      d3.mouse = function(container) {
        return d3_mousePoint(container, d3_eventSource());
      };
      var d3_mouse_bug44083 = /WebKit/.test(navigator.userAgent) ? -1 : 0;
      d3.touches = function(container, touches) {
        if (arguments.length < 2) touches = d3_eventSource().touches;
        return touches ? d3_array(touches).map(function(touch) {
          var point = d3_mousePoint(container, touch);
          point.identifier = touch.identifier;
          return point;
        }) : [];
      };
      d3.scale = {};
      d3.scale.linear = function() {
        return d3_scale_linear([ 0, 1 ], [ 0, 1 ], d3.interpolate, false);
      };
      d3.scale.log = function() {
        return d3_scale_log(d3.scale.linear(), d3_scale_logp);
      };
      var d3_scale_logFormat = d3.format(".0e");
      d3_scale_logp.pow = function(x) {
        return Math.pow(10, x);
      };
      d3_scale_logn.pow = function(x) {
        return -Math.pow(10, -x);
      };
      d3.scale.pow = function() {
        return d3_scale_pow(d3.scale.linear(), 1);
      };
      d3.scale.sqrt = function() {
        return d3.scale.pow().exponent(.5);
      };
      d3.scale.ordinal = function() {
        return d3_scale_ordinal([], {
          t: "range",
          a: [ [] ]
        });
      };
      d3.scale.category10 = function() {
        return d3.scale.ordinal().range(d3_category10);
      };
      d3.scale.category20 = function() {
        return d3.scale.ordinal().range(d3_category20);
      };
      d3.scale.category20b = function() {
        return d3.scale.ordinal().range(d3_category20b);
      };
      d3.scale.category20c = function() {
        return d3.scale.ordinal().range(d3_category20c);
      };
      var d3_category10 = [ "#1f77b4", "#ff7f0e", "#2ca02c", "#d62728", "#9467bd", "#8c564b", "#e377c2", "#7f7f7f", "#bcbd22", "#17becf" ];
      var d3_category20 = [ "#1f77b4", "#aec7e8", "#ff7f0e", "#ffbb78", "#2ca02c", "#98df8a", "#d62728", "#ff9896", "#9467bd", "#c5b0d5", "#8c564b", "#c49c94", "#e377c2", "#f7b6d2", "#7f7f7f", "#c7c7c7", "#bcbd22", "#dbdb8d", "#17becf", "#9edae5" ];
      var d3_category20b = [ "#393b79", "#5254a3", "#6b6ecf", "#9c9ede", "#637939", "#8ca252", "#b5cf6b", "#cedb9c", "#8c6d31", "#bd9e39", "#e7ba52", "#e7cb94", "#843c39", "#ad494a", "#d6616b", "#e7969c", "#7b4173", "#a55194", "#ce6dbd", "#de9ed6" ];
      var d3_category20c = [ "#3182bd", "#6baed6", "#9ecae1", "#c6dbef", "#e6550d", "#fd8d3c", "#fdae6b", "#fdd0a2", "#31a354", "#74c476", "#a1d99b", "#c7e9c0", "#756bb1", "#9e9ac8", "#bcbddc", "#dadaeb", "#636363", "#969696", "#bdbdbd", "#d9d9d9" ];
      d3.scale.quantile = function() {
        return d3_scale_quantile([], []);
      };
      d3.scale.quantize = function() {
        return d3_scale_quantize(0, 1, [ 0, 1 ]);
      };
      d3.scale.threshold = function() {
        return d3_scale_threshold([ .5 ], [ 0, 1 ]);
      };
      d3.scale.identity = function() {
        return d3_scale_identity([ 0, 1 ]);
      };
      d3.svg = {};
      d3.svg.arc = function() {
        function arc() {
          var r0 = innerRadius.apply(this, arguments), r1 = outerRadius.apply(this, arguments), a0 = startAngle.apply(this, arguments) + d3_svg_arcOffset, a1 = endAngle.apply(this, arguments) + d3_svg_arcOffset, da = (a1 < a0 && (da = a0, a0 = a1, a1 = da), a1 - a0), df = da < Math.PI ? "0" : "1", c0 = Math.cos(a0), s0 = Math.sin(a0), c1 = Math.cos(a1), s1 = Math.sin(a1);
          return da >= d3_svg_arcMax ? r0 ? "M0," + r1 + "A" + r1 + "," + r1 + " 0 1,1 0," + -r1 + "A" + r1 + "," + r1 + " 0 1,1 0," + r1 + "M0," + r0 + "A" + r0 + "," + r0 + " 0 1,0 0," + -r0 + "A" + r0 + "," + r0 + " 0 1,0 0," + r0 + "Z" : "M0," + r1 + "A" + r1 + "," + r1 + " 0 1,1 0," + -r1 + "A" + r1 + "," + r1 + " 0 1,1 0," + r1 + "Z" : r0 ? "M" + r1 * c0 + "," + r1 * s0 + "A" + r1 + "," + r1 + " 0 " + df + ",1 " + r1 * c1 + "," + r1 * s1 + "L" + r0 * c1 + "," + r0 * s1 + "A" + r0 + "," + r0 + " 0 " + df + ",0 " + r0 * c0 + "," + r0 * s0 + "Z" : "M" + r1 * c0 + "," + r1 * s0 + "A" + r1 + "," + r1 + " 0 " + df + ",1 " + r1 * c1 + "," + r1 * s1 + "L0,0" + "Z";
        }
        var innerRadius = d3_svg_arcInnerRadius, outerRadius = d3_svg_arcOuterRadius, startAngle = d3_svg_arcStartAngle, endAngle = d3_svg_arcEndAngle;
        arc.innerRadius = function(v) {
          if (!arguments.length) return innerRadius;
          innerRadius = d3_functor(v);
          return arc;
        };
        arc.outerRadius = function(v) {
          if (!arguments.length) return outerRadius;
          outerRadius = d3_functor(v);
          return arc;
        };
        arc.startAngle = function(v) {
          if (!arguments.length) return startAngle;
          startAngle = d3_functor(v);
          return arc;
        };
        arc.endAngle = function(v) {
          if (!arguments.length) return endAngle;
          endAngle = d3_functor(v);
          return arc;
        };
        arc.centroid = function() {
          var r = (innerRadius.apply(this, arguments) + outerRadius.apply(this, arguments)) / 2, a = (startAngle.apply(this, arguments) + endAngle.apply(this, arguments)) / 2 + d3_svg_arcOffset;
          return [ Math.cos(a) * r, Math.sin(a) * r ];
        };
        return arc;
      };
      var d3_svg_arcOffset = -Math.PI / 2, d3_svg_arcMax = 2 * Math.PI - 1e-6;
      d3.svg.line = function() {
        return d3_svg_line(d3_identity);
      };
      var d3_svg_lineInterpolators = d3.map({
        linear: d3_svg_lineLinear,
        "linear-closed": d3_svg_lineLinearClosed,
        "step-before": d3_svg_lineStepBefore,
        "step-after": d3_svg_lineStepAfter,
        basis: d3_svg_lineBasis,
        "basis-open": d3_svg_lineBasisOpen,
        "basis-closed": d3_svg_lineBasisClosed,
        bundle: d3_svg_lineBundle,
        cardinal: d3_svg_lineCardinal,
        "cardinal-open": d3_svg_lineCardinalOpen,
        "cardinal-closed": d3_svg_lineCardinalClosed,
        monotone: d3_svg_lineMonotone
      });
      d3_svg_lineInterpolators.forEach(function(key, value) {
        value.key = key;
        value.closed = /-closed$/.test(key);
      });
      var d3_svg_lineBasisBezier1 = [ 0, 2 / 3, 1 / 3, 0 ], d3_svg_lineBasisBezier2 = [ 0, 1 / 3, 2 / 3, 0 ], d3_svg_lineBasisBezier3 = [ 0, 1 / 6, 2 / 3, 1 / 6 ];
      d3.svg.line.radial = function() {
        var line = d3_svg_line(d3_svg_lineRadial);
        line.radius = line.x, delete line.x;
        line.angle = line.y, delete line.y;
        return line;
      };
      d3_svg_lineStepBefore.reverse = d3_svg_lineStepAfter;
      d3_svg_lineStepAfter.reverse = d3_svg_lineStepBefore;
      d3.svg.area = function() {
        return d3_svg_area(d3_identity);
      };
      d3.svg.area.radial = function() {
        var area = d3_svg_area(d3_svg_lineRadial);
        area.radius = area.x, delete area.x;
        area.innerRadius = area.x0, delete area.x0;
        area.outerRadius = area.x1, delete area.x1;
        area.angle = area.y, delete area.y;
        area.startAngle = area.y0, delete area.y0;
        area.endAngle = area.y1, delete area.y1;
        return area;
      };
      d3.svg.chord = function() {
        function chord(d, i) {
          var s = subgroup(this, source, d, i), t = subgroup(this, target, d, i);
          return "M" + s.p0 + arc(s.r, s.p1, s.a1 - s.a0) + (equals(s, t) ? curve(s.r, s.p1, s.r, s.p0) : curve(s.r, s.p1, t.r, t.p0) + arc(t.r, t.p1, t.a1 - t.a0) + curve(t.r, t.p1, s.r, s.p0)) + "Z";
        }
        function subgroup(self, f, d, i) {
          var subgroup = f.call(self, d, i), r = radius.call(self, subgroup, i), a0 = startAngle.call(self, subgroup, i) + d3_svg_arcOffset, a1 = endAngle.call(self, subgroup, i) + d3_svg_arcOffset;
          return {
            r: r,
            a0: a0,
            a1: a1,
            p0: [ r * Math.cos(a0), r * Math.sin(a0) ],
            p1: [ r * Math.cos(a1), r * Math.sin(a1) ]
          };
        }
        function equals(a, b) {
          return a.a0 == b.a0 && a.a1 == b.a1;
        }
        function arc(r, p, a) {
          return "A" + r + "," + r + " 0 " + +(a > Math.PI) + ",1 " + p;
        }
        function curve(r0, p0, r1, p1) {
          return "Q 0,0 " + p1;
        }
        var source = d3_svg_chordSource, target = d3_svg_chordTarget, radius = d3_svg_chordRadius, startAngle = d3_svg_arcStartAngle, endAngle = d3_svg_arcEndAngle;
        chord.radius = function(v) {
          if (!arguments.length) return radius;
          radius = d3_functor(v);
          return chord;
        };
        chord.source = function(v) {
          if (!arguments.length) return source;
          source = d3_functor(v);
          return chord;
        };
        chord.target = function(v) {
          if (!arguments.length) return target;
          target = d3_functor(v);
          return chord;
        };
        chord.startAngle = function(v) {
          if (!arguments.length) return startAngle;
          startAngle = d3_functor(v);
          return chord;
        };
        chord.endAngle = function(v) {
          if (!arguments.length) return endAngle;
          endAngle = d3_functor(v);
          return chord;
        };
        return chord;
      };
      d3.svg.diagonal = function() {
        function diagonal(d, i) {
          var p0 = source.call(this, d, i), p3 = target.call(this, d, i), m = (p0.y + p3.y) / 2, p = [ p0, {
            x: p0.x,
            y: m
          }, {
            x: p3.x,
            y: m
          }, p3 ];
          p = p.map(projection);
          return "M" + p[0] + "C" + p[1] + " " + p[2] + " " + p[3];
        }
        var source = d3_svg_chordSource, target = d3_svg_chordTarget, projection = d3_svg_diagonalProjection;
        diagonal.source = function(x) {
          if (!arguments.length) return source;
          source = d3_functor(x);
          return diagonal;
        };
        diagonal.target = function(x) {
          if (!arguments.length) return target;
          target = d3_functor(x);
          return diagonal;
        };
        diagonal.projection = function(x) {
          if (!arguments.length) return projection;
          projection = x;
          return diagonal;
        };
        return diagonal;
      };
      d3.svg.diagonal.radial = function() {
        var diagonal = d3.svg.diagonal(), projection = d3_svg_diagonalProjection, projection_ = diagonal.projection;
        diagonal.projection = function(x) {
          return arguments.length ? projection_(d3_svg_diagonalRadialProjection(projection = x)) : projection;
        };
        return diagonal;
      };
      d3.svg.mouse = d3.mouse;
      d3.svg.touches = d3.touches;
      d3.svg.symbol = function() {
        function symbol(d, i) {
          return (d3_svg_symbols.get(type.call(this, d, i)) || d3_svg_symbolCircle)(size.call(this, d, i));
        }
        var type = d3_svg_symbolType, size = d3_svg_symbolSize;
        symbol.type = function(x) {
          if (!arguments.length) return type;
          type = d3_functor(x);
          return symbol;
        };
        symbol.size = function(x) {
          if (!arguments.length) return size;
          size = d3_functor(x);
          return symbol;
        };
        return symbol;
      };
      var d3_svg_symbols = d3.map({
        circle: d3_svg_symbolCircle,
        cross: function(size) {
          var r = Math.sqrt(size / 5) / 2;
          return "M" + -3 * r + "," + -r + "H" + -r + "V" + -3 * r + "H" + r + "V" + -r + "H" + 3 * r + "V" + r + "H" + r + "V" + 3 * r + "H" + -r + "V" + r + "H" + -3 * r + "Z";
        },
        diamond: function(size) {
          var ry = Math.sqrt(size / (2 * d3_svg_symbolTan30)), rx = ry * d3_svg_symbolTan30;
          return "M0," + -ry + "L" + rx + ",0" + " 0," + ry + " " + -rx + ",0" + "Z";
        },
        square: function(size) {
          var r = Math.sqrt(size) / 2;
          return "M" + -r + "," + -r + "L" + r + "," + -r + " " + r + "," + r + " " + -r + "," + r + "Z";
        },
        "triangle-down": function(size) {
          var rx = Math.sqrt(size / d3_svg_symbolSqrt3), ry = rx * d3_svg_symbolSqrt3 / 2;
          return "M0," + ry + "L" + rx + "," + -ry + " " + -rx + "," + -ry + "Z";
        },
        "triangle-up": function(size) {
          var rx = Math.sqrt(size / d3_svg_symbolSqrt3), ry = rx * d3_svg_symbolSqrt3 / 2;
          return "M0," + -ry + "L" + rx + "," + ry + " " + -rx + "," + ry + "Z";
        }
      });
      d3.svg.symbolTypes = d3_svg_symbols.keys();
      var d3_svg_symbolSqrt3 = Math.sqrt(3), d3_svg_symbolTan30 = Math.tan(30 * Math.PI / 180);
      d3.svg.axis = function() {
        function axis(g) {
          g.each(function() {
            var g = d3.select(this);
            var ticks = tickValues == null ? scale.ticks ? scale.ticks.apply(scale, tickArguments_) : scale.domain() : tickValues, tickFormat = tickFormat_ == null ? scale.tickFormat ? scale.tickFormat.apply(scale, tickArguments_) : String : tickFormat_;
            var subticks = d3_svg_axisSubdivide(scale, ticks, tickSubdivide), subtick = g.selectAll(".minor").data(subticks, String), subtickEnter = subtick.enter().insert("line", "g").attr("class", "tick minor").style("opacity", 1e-6), subtickExit = d3.transition(subtick.exit()).style("opacity", 1e-6).remove(), subtickUpdate = d3.transition(subtick).style("opacity", 1);
            var tick = g.selectAll("g").data(ticks, String), tickEnter = tick.enter().insert("g", "path").style("opacity", 1e-6), tickExit = d3.transition(tick.exit()).style("opacity", 1e-6).remove(), tickUpdate = d3.transition(tick).style("opacity", 1), tickTransform;
            var range = d3_scaleRange(scale), path = g.selectAll(".domain").data([ 0 ]), pathEnter = path.enter().append("path").attr("class", "domain"), pathUpdate = d3.transition(path);
            var scale1 = scale.copy(), scale0 = this.__chart__ || scale1;
            this.__chart__ = scale1;
            tickEnter.append("line").attr("class", "tick");
            tickEnter.append("text");
            var lineEnter = tickEnter.select("line"), lineUpdate = tickUpdate.select("line"), text = tick.select("text").text(tickFormat), textEnter = tickEnter.select("text"), textUpdate = tickUpdate.select("text");
            switch (orient) {
             case "bottom":
              {
                tickTransform = d3_svg_axisX;
                subtickEnter.attr("y2", tickMinorSize);
                subtickUpdate.attr("x2", 0).attr("y2", tickMinorSize);
                lineEnter.attr("y2", tickMajorSize);
                textEnter.attr("y", Math.max(tickMajorSize, 0) + tickPadding);
                lineUpdate.attr("x2", 0).attr("y2", tickMajorSize);
                textUpdate.attr("x", 0).attr("y", Math.max(tickMajorSize, 0) + tickPadding);
                text.attr("dy", ".71em").attr("text-anchor", "middle");
                pathUpdate.attr("d", "M" + range[0] + "," + tickEndSize + "V0H" + range[1] + "V" + tickEndSize);
                break;
              }
             case "top":
              {
                tickTransform = d3_svg_axisX;
                subtickEnter.attr("y2", -tickMinorSize);
                subtickUpdate.attr("x2", 0).attr("y2", -tickMinorSize);
                lineEnter.attr("y2", -tickMajorSize);
                textEnter.attr("y", -(Math.max(tickMajorSize, 0) + tickPadding));
                lineUpdate.attr("x2", 0).attr("y2", -tickMajorSize);
                textUpdate.attr("x", 0).attr("y", -(Math.max(tickMajorSize, 0) + tickPadding));
                text.attr("dy", "0em").attr("text-anchor", "middle");
                pathUpdate.attr("d", "M" + range[0] + "," + -tickEndSize + "V0H" + range[1] + "V" + -tickEndSize);
                break;
              }
             case "left":
              {
                tickTransform = d3_svg_axisY;
                subtickEnter.attr("x2", -tickMinorSize);
                subtickUpdate.attr("x2", -tickMinorSize).attr("y2", 0);
                lineEnter.attr("x2", -tickMajorSize);
                textEnter.attr("x", -(Math.max(tickMajorSize, 0) + tickPadding));
                lineUpdate.attr("x2", -tickMajorSize).attr("y2", 0);
                textUpdate.attr("x", -(Math.max(tickMajorSize, 0) + tickPadding)).attr("y", 0);
                text.attr("dy", ".32em").attr("text-anchor", "end");
                pathUpdate.attr("d", "M" + -tickEndSize + "," + range[0] + "H0V" + range[1] + "H" + -tickEndSize);
                break;
              }
             case "right":
              {
                tickTransform = d3_svg_axisY;
                subtickEnter.attr("x2", tickMinorSize);
                subtickUpdate.attr("x2", tickMinorSize).attr("y2", 0);
                lineEnter.attr("x2", tickMajorSize);
                textEnter.attr("x", Math.max(tickMajorSize, 0) + tickPadding);
                lineUpdate.attr("x2", tickMajorSize).attr("y2", 0);
                textUpdate.attr("x", Math.max(tickMajorSize, 0) + tickPadding).attr("y", 0);
                text.attr("dy", ".32em").attr("text-anchor", "start");
                pathUpdate.attr("d", "M" + tickEndSize + "," + range[0] + "H0V" + range[1] + "H" + tickEndSize);
                break;
              }
            }
            if (scale.ticks) {
              tickEnter.call(tickTransform, scale0);
              tickUpdate.call(tickTransform, scale1);
              tickExit.call(tickTransform, scale1);
              subtickEnter.call(tickTransform, scale0);
              subtickUpdate.call(tickTransform, scale1);
              subtickExit.call(tickTransform, scale1);
            } else {
              var dx = scale1.rangeBand() / 2, x = function(d) {
                return scale1(d) + dx;
              };
              tickEnter.call(tickTransform, x);
              tickUpdate.call(tickTransform, x);
            }
          });
        }
        var scale = d3.scale.linear(), orient = "bottom", tickMajorSize = 6, tickMinorSize = 6, tickEndSize = 6, tickPadding = 3, tickArguments_ = [ 10 ], tickValues = null, tickFormat_, tickSubdivide = 0;
        axis.scale = function(x) {
          if (!arguments.length) return scale;
          scale = x;
          return axis;
        };
        axis.orient = function(x) {
          if (!arguments.length) return orient;
          orient = x;
          return axis;
        };
        axis.ticks = function() {
          if (!arguments.length) return tickArguments_;
          tickArguments_ = arguments;
          return axis;
        };
        axis.tickValues = function(x) {
          if (!arguments.length) return tickValues;
          tickValues = x;
          return axis;
        };
        axis.tickFormat = function(x) {
          if (!arguments.length) return tickFormat_;
          tickFormat_ = x;
          return axis;
        };
        axis.tickSize = function(x, y, z) {
          if (!arguments.length) return tickMajorSize;
          var n = arguments.length - 1;
          tickMajorSize = +x;
          tickMinorSize = n > 1 ? +y : tickMajorSize;
          tickEndSize = n > 0 ? +arguments[n] : tickMajorSize;
          return axis;
        };
        axis.tickPadding = function(x) {
          if (!arguments.length) return tickPadding;
          tickPadding = +x;
          return axis;
        };
        axis.tickSubdivide = function(x) {
          if (!arguments.length) return tickSubdivide;
          tickSubdivide = +x;
          return axis;
        };
        return axis;
      };
      d3.svg.brush = function() {
        function brush(g) {
          g.each(function() {
            var g = d3.select(this), bg = g.selectAll(".background").data([ 0 ]), fg = g.selectAll(".extent").data([ 0 ]), tz = g.selectAll(".resize").data(resizes, String), e;
            g.style("pointer-events", "all").on("mousedown.brush", brushstart).on("touchstart.brush", brushstart);
            bg.enter().append("rect").attr("class", "background").style("visibility", "hidden").style("cursor", "crosshair");
            fg.enter().append("rect").attr("class", "extent").style("cursor", "move");
            tz.enter().append("g").attr("class", function(d) {
              return "resize " + d;
            }).style("cursor", function(d) {
              return d3_svg_brushCursor[d];
            }).append("rect").attr("x", function(d) {
              return /[ew]$/.test(d) ? -3 : null;
            }).attr("y", function(d) {
              return /^[ns]/.test(d) ? -3 : null;
            }).attr("width", 6).attr("height", 6).style("visibility", "hidden");
            tz.style("display", brush.empty() ? "none" : null);
            tz.exit().remove();
            if (x) {
              e = d3_scaleRange(x);
              bg.attr("x", e[0]).attr("width", e[1] - e[0]);
              redrawX(g);
            }
            if (y) {
              e = d3_scaleRange(y);
              bg.attr("y", e[0]).attr("height", e[1] - e[0]);
              redrawY(g);
            }
            redraw(g);
          });
        }
        function redraw(g) {
          g.selectAll(".resize").attr("transform", function(d) {
            return "translate(" + extent[+/e$/.test(d)][0] + "," + extent[+/^s/.test(d)][1] + ")";
          });
        }
        function redrawX(g) {
          g.select(".extent").attr("x", extent[0][0]);
          g.selectAll(".extent,.n>rect,.s>rect").attr("width", extent[1][0] - extent[0][0]);
        }
        function redrawY(g) {
          g.select(".extent").attr("y", extent[0][1]);
          g.selectAll(".extent,.e>rect,.w>rect").attr("height", extent[1][1] - extent[0][1]);
        }
        function brushstart() {
          function mouse() {
            var touches = d3.event.changedTouches;
            return touches ? d3.touches(target, touches)[0] : d3.mouse(target);
          }
          function keydown() {
            if (d3.event.keyCode == 32) {
              if (!dragging) {
                center = null;
                origin[0] -= extent[1][0];
                origin[1] -= extent[1][1];
                dragging = 2;
              }
              d3_eventCancel();
            }
          }
          function keyup() {
            if (d3.event.keyCode == 32 && dragging == 2) {
              origin[0] += extent[1][0];
              origin[1] += extent[1][1];
              dragging = 0;
              d3_eventCancel();
            }
          }
          function brushmove() {
            var point = mouse(), moved = false;
            if (offset) {
              point[0] += offset[0];
              point[1] += offset[1];
            }
            if (!dragging) {
              if (d3.event.altKey) {
                if (!center) center = [ (extent[0][0] + extent[1][0]) / 2, (extent[0][1] + extent[1][1]) / 2 ];
                origin[0] = extent[+(point[0] < center[0])][0];
                origin[1] = extent[+(point[1] < center[1])][1];
              } else center = null;
            }
            if (resizingX && move1(point, x, 0)) {
              redrawX(g);
              moved = true;
            }
            if (resizingY && move1(point, y, 1)) {
              redrawY(g);
              moved = true;
            }
            if (moved) {
              redraw(g);
              event_({
                type: "brush",
                mode: dragging ? "move" : "resize"
              });
            }
          }
          function move1(point, scale, i) {
            var range = d3_scaleRange(scale), r0 = range[0], r1 = range[1], position = origin[i], size = extent[1][i] - extent[0][i], min, max;
            if (dragging) {
              r0 -= position;
              r1 -= size + position;
            }
            min = Math.max(r0, Math.min(r1, point[i]));
            if (dragging) {
              max = (min += position) + size;
            } else {
              if (center) position = Math.max(r0, Math.min(r1, 2 * center[i] - min));
              if (position < min) {
                max = min;
                min = position;
              } else {
                max = position;
              }
            }
            if (extent[0][i] !== min || extent[1][i] !== max) {
              extentDomain = null;
              extent[0][i] = min;
              extent[1][i] = max;
              return true;
            }
          }
          function brushend() {
            brushmove();
            g.style("pointer-events", "all").selectAll(".resize").style("display", brush.empty() ? "none" : null);
            d3.select("body").style("cursor", null);
            w.on("mousemove.brush", null).on("mouseup.brush", null).on("touchmove.brush", null).on("touchend.brush", null).on("keydown.brush", null).on("keyup.brush", null);
            event_({
              type: "brushend"
            });
            d3_eventCancel();
          }
          var target = this, eventTarget = d3.select(d3.event.target), event_ = event.of(target, arguments), g = d3.select(target), resizing = eventTarget.datum(), resizingX = !/^(n|s)$/.test(resizing) && x, resizingY = !/^(e|w)$/.test(resizing) && y, dragging = eventTarget.classed("extent"), center, origin = mouse(), offset;
          var w = d3.select(window).on("mousemove.brush", brushmove).on("mouseup.brush", brushend).on("touchmove.brush", brushmove).on("touchend.brush", brushend).on("keydown.brush", keydown).on("keyup.brush", keyup);
          if (dragging) {
            origin[0] = extent[0][0] - origin[0];
            origin[1] = extent[0][1] - origin[1];
          } else if (resizing) {
            var ex = +/w$/.test(resizing), ey = +/^n/.test(resizing);
            offset = [ extent[1 - ex][0] - origin[0], extent[1 - ey][1] - origin[1] ];
            origin[0] = extent[ex][0];
            origin[1] = extent[ey][1];
          } else if (d3.event.altKey) center = origin.slice();
          g.style("pointer-events", "none").selectAll(".resize").style("display", null);
          d3.select("body").style("cursor", eventTarget.style("cursor"));
          event_({
            type: "brushstart"
          });
          brushmove();
          d3_eventCancel();
        }
        var event = d3_eventDispatch(brush, "brushstart", "brush", "brushend"), x = null, y = null, resizes = d3_svg_brushResizes[0], extent = [ [ 0, 0 ], [ 0, 0 ] ], extentDomain;
        brush.x = function(z) {
          if (!arguments.length) return x;
          x = z;
          resizes = d3_svg_brushResizes[!x << 1 | !y];
          return brush;
        };
        brush.y = function(z) {
          if (!arguments.length) return y;
          y = z;
          resizes = d3_svg_brushResizes[!x << 1 | !y];
          return brush;
        };
        brush.extent = function(z) {
          var x0, x1, y0, y1, t;
          if (!arguments.length) {
            z = extentDomain || extent;
            if (x) {
              x0 = z[0][0], x1 = z[1][0];
              if (!extentDomain) {
                x0 = extent[0][0], x1 = extent[1][0];
                if (x.invert) x0 = x.invert(x0), x1 = x.invert(x1);
                if (x1 < x0) t = x0, x0 = x1, x1 = t;
              }
            }
            if (y) {
              y0 = z[0][1], y1 = z[1][1];
              if (!extentDomain) {
                y0 = extent[0][1], y1 = extent[1][1];
                if (y.invert) y0 = y.invert(y0), y1 = y.invert(y1);
                if (y1 < y0) t = y0, y0 = y1, y1 = t;
              }
            }
            return x && y ? [ [ x0, y0 ], [ x1, y1 ] ] : x ? [ x0, x1 ] : y && [ y0, y1 ];
          }
          extentDomain = [ [ 0, 0 ], [ 0, 0 ] ];
          if (x) {
            x0 = z[0], x1 = z[1];
            if (y) x0 = x0[0], x1 = x1[0];
            extentDomain[0][0] = x0, extentDomain[1][0] = x1;
            if (x.invert) x0 = x(x0), x1 = x(x1);
            if (x1 < x0) t = x0, x0 = x1, x1 = t;
            extent[0][0] = x0 | 0, extent[1][0] = x1 | 0;
          }
          if (y) {
            y0 = z[0], y1 = z[1];
            if (x) y0 = y0[1], y1 = y1[1];
            extentDomain[0][1] = y0, extentDomain[1][1] = y1;
            if (y.invert) y0 = y(y0), y1 = y(y1);
            if (y1 < y0) t = y0, y0 = y1, y1 = t;
            extent[0][1] = y0 | 0, extent[1][1] = y1 | 0;
          }
          return brush;
        };
        brush.clear = function() {
          extentDomain = null;
          extent[0][0] = extent[0][1] = extent[1][0] = extent[1][1] = 0;
          return brush;
        };
        brush.empty = function() {
          return x && extent[0][0] === extent[1][0] || y && extent[0][1] === extent[1][1];
        };
        return d3.rebind(brush, event, "on");
      };
      var d3_svg_brushCursor = {
        n: "ns-resize",
        e: "ew-resize",
        s: "ns-resize",
        w: "ew-resize",
        nw: "nwse-resize",
        ne: "nesw-resize",
        se: "nwse-resize",
        sw: "nesw-resize"
      };
      var d3_svg_brushResizes = [ [ "n", "e", "s", "w", "nw", "ne", "se", "sw" ], [ "e", "w" ], [ "n", "s" ], [] ];
      d3.behavior = {};
      d3.behavior.drag = function() {
        function drag() {
          this.on("mousedown.drag", mousedown).on("touchstart.drag", mousedown);
        }
        function mousedown() {
          function point() {
            var p = target.parentNode;
            return touchId ? d3.touches(p).filter(function(p) {
              return p.identifier === touchId;
            })[0] : d3.mouse(p);
          }
          function dragmove() {
            if (!target.parentNode) return dragend();
            var p = point(), dx = p[0] - origin_[0], dy = p[1] - origin_[1];
            moved |= dx | dy;
            origin_ = p;
            d3_eventCancel();
            event_({
              type: "drag",
              x: p[0] + offset[0],
              y: p[1] + offset[1],
              dx: dx,
              dy: dy
            });
          }
          function dragend() {
            event_({
              type: "dragend"
            });
            if (moved) {
              d3_eventCancel();
              if (d3.event.target === eventTarget) w.on("click.drag", click, true);
            }
            w.on(touchId ? "touchmove.drag-" + touchId : "mousemove.drag", null).on(touchId ? "touchend.drag-" + touchId : "mouseup.drag", null);
          }
          function click() {
            d3_eventCancel();
            w.on("click.drag", null);
          }
          var target = this, event_ = event.of(target, arguments), eventTarget = d3.event.target, touchId = d3.event.touches && d3.event.changedTouches[0].identifier, offset, origin_ = point(), moved = 0;
          var w = d3.select(window).on(touchId ? "touchmove.drag-" + touchId : "mousemove.drag", dragmove).on(touchId ? "touchend.drag-" + touchId : "mouseup.drag", dragend, true);
          if (origin) {
            offset = origin.apply(target, arguments);
            offset = [ offset.x - origin_[0], offset.y - origin_[1] ];
          } else {
            offset = [ 0, 0 ];
          }
          if (!touchId) d3_eventCancel();
          event_({
            type: "dragstart"
          });
        }
        var event = d3_eventDispatch(drag, "drag", "dragstart", "dragend"), origin = null;
        drag.origin = function(x) {
          if (!arguments.length) return origin;
          origin = x;
          return drag;
        };
        return d3.rebind(drag, event, "on");
      };
      d3.behavior.zoom = function() {
        function zoom() {
          this.on("mousedown.zoom", mousedown).on("mousewheel.zoom", mousewheel).on("mousemove.zoom", mousemove).on("DOMMouseScroll.zoom", mousewheel).on("dblclick.zoom", dblclick).on("touchstart.zoom", touchstart).on("touchmove.zoom", touchmove).on("touchend.zoom", touchstart);
        }
        function location(p) {
          return [ (p[0] - translate[0]) / scale, (p[1] - translate[1]) / scale ];
        }
        function point(l) {
          return [ l[0] * scale + translate[0], l[1] * scale + translate[1] ];
        }
        function scaleTo(s) {
          scale = Math.max(scaleExtent[0], Math.min(scaleExtent[1], s));
        }
        function translateTo(p, l) {
          l = point(l);
          translate[0] += p[0] - l[0];
          translate[1] += p[1] - l[1];
        }
        function dispatch(event) {
          if (x1) x1.domain(x0.range().map(function(x) {
            return (x - translate[0]) / scale;
          }).map(x0.invert));
          if (y1) y1.domain(y0.range().map(function(y) {
            return (y - translate[1]) / scale;
          }).map(y0.invert));
          d3.event.preventDefault();
          event({
            type: "zoom",
            scale: scale,
            translate: translate
          });
        }
        function mousedown() {
          function mousemove() {
            moved = 1;
            translateTo(d3.mouse(target), l);
            dispatch(event_);
          }
          function mouseup() {
            if (moved) d3_eventCancel();
            w.on("mousemove.zoom", null).on("mouseup.zoom", null);
            if (moved && d3.event.target === eventTarget) w.on("click.zoom", click, true);
          }
          function click() {
            d3_eventCancel();
            w.on("click.zoom", null);
          }
          var target = this, event_ = event.of(target, arguments), eventTarget = d3.event.target, moved = 0, w = d3.select(window).on("mousemove.zoom", mousemove).on("mouseup.zoom", mouseup), l = location(d3.mouse(target));
          window.focus();
          d3_eventCancel();
        }
        function mousewheel() {
          if (!translate0) translate0 = location(d3.mouse(this));
          scaleTo(Math.pow(2, d3_behavior_zoomDelta() * .002) * scale);
          translateTo(d3.mouse(this), translate0);
          dispatch(event.of(this, arguments));
        }
        function mousemove() {
          translate0 = null;
        }
        function dblclick() {
          var p = d3.mouse(this), l = location(p);
          scaleTo(d3.event.shiftKey ? scale / 2 : scale * 2);
          translateTo(p, l);
          dispatch(event.of(this, arguments));
        }
        function touchstart() {
          var touches = d3.touches(this), now = Date.now();
          scale0 = scale;
          translate0 = {};
          touches.forEach(function(t) {
            translate0[t.identifier] = location(t);
          });
          d3_eventCancel();
          if (touches.length === 1) {
            if (now - touchtime < 500) {
              var p = touches[0], l = location(touches[0]);
              scaleTo(scale * 2);
              translateTo(p, l);
              dispatch(event.of(this, arguments));
            }
            touchtime = now;
          }
        }
        function touchmove() {
          var touches = d3.touches(this), p0 = touches[0], l0 = translate0[p0.identifier];
          if (p1 = touches[1]) {
            var p1, l1 = translate0[p1.identifier];
            p0 = [ (p0[0] + p1[0]) / 2, (p0[1] + p1[1]) / 2 ];
            l0 = [ (l0[0] + l1[0]) / 2, (l0[1] + l1[1]) / 2 ];
            scaleTo(d3.event.scale * scale0);
          }
          translateTo(p0, l0);
          touchtime = null;
          dispatch(event.of(this, arguments));
        }
        var translate = [ 0, 0 ], translate0, scale = 1, scale0, scaleExtent = d3_behavior_zoomInfinity, event = d3_eventDispatch(zoom, "zoom"), x0, x1, y0, y1, touchtime;
        zoom.translate = function(x) {
          if (!arguments.length) return translate;
          translate = x.map(Number);
          return zoom;
        };
        zoom.scale = function(x) {
          if (!arguments.length) return scale;
          scale = +x;
          return zoom;
        };
        zoom.scaleExtent = function(x) {
          if (!arguments.length) return scaleExtent;
          scaleExtent = x == null ? d3_behavior_zoomInfinity : x.map(Number);
          return zoom;
        };
        zoom.x = function(z) {
          if (!arguments.length) return x1;
          x1 = z;
          x0 = z.copy();
          return zoom;
        };
        zoom.y = function(z) {
          if (!arguments.length) return y1;
          y1 = z;
          y0 = z.copy();
          return zoom;
        };
        return d3.rebind(zoom, event, "on");
      };
      var d3_behavior_zoomDiv, d3_behavior_zoomInfinity = [ 0, Infinity ];
      d3.layout = {};
      d3.layout.bundle = function() {
        return function(links) {
          var paths = [], i = -1, n = links.length;
          while (++i < n) paths.push(d3_layout_bundlePath(links[i]));
          return paths;
        };
      };
      d3.layout.chord = function() {
        function relayout() {
          var subgroups = {}, groupSums = [], groupIndex = d3.range(n), subgroupIndex = [], k, x, x0, i, j;
          chords = [];
          groups = [];
          k = 0, i = -1;
          while (++i < n) {
            x = 0, j = -1;
            while (++j < n) {
              x += matrix[i][j];
            }
            groupSums.push(x);
            subgroupIndex.push(d3.range(n));
            k += x;
          }
          if (sortGroups) {
            groupIndex.sort(function(a, b) {
              return sortGroups(groupSums[a], groupSums[b]);
            });
          }
          if (sortSubgroups) {
            subgroupIndex.forEach(function(d, i) {
              d.sort(function(a, b) {
                return sortSubgroups(matrix[i][a], matrix[i][b]);
              });
            });
          }
          k = (2 * Math.PI - padding * n) / k;
          x = 0, i = -1;
          while (++i < n) {
            x0 = x, j = -1;
            while (++j < n) {
              var di = groupIndex[i], dj = subgroupIndex[di][j], v = matrix[di][dj], a0 = x, a1 = x += v * k;
              subgroups[di + "-" + dj] = {
                index: di,
                subindex: dj,
                startAngle: a0,
                endAngle: a1,
                value: v
              };
            }
            groups[di] = {
              index: di,
              startAngle: x0,
              endAngle: x,
              value: (x - x0) / k
            };
            x += padding;
          }
          i = -1;
          while (++i < n) {
            j = i - 1;
            while (++j < n) {
              var source = subgroups[i + "-" + j], target = subgroups[j + "-" + i];
              if (source.value || target.value) {
                chords.push(source.value < target.value ? {
                  source: target,
                  target: source
                } : {
                  source: source,
                  target: target
                });
              }
            }
          }
          if (sortChords) resort();
        }
        function resort() {
          chords.sort(function(a, b) {
            return sortChords((a.source.value + a.target.value) / 2, (b.source.value + b.target.value) / 2);
          });
        }
        var chord = {}, chords, groups, matrix, n, padding = 0, sortGroups, sortSubgroups, sortChords;
        chord.matrix = function(x) {
          if (!arguments.length) return matrix;
          n = (matrix = x) && matrix.length;
          chords = groups = null;
          return chord;
        };
        chord.padding = function(x) {
          if (!arguments.length) return padding;
          padding = x;
          chords = groups = null;
          return chord;
        };
        chord.sortGroups = function(x) {
          if (!arguments.length) return sortGroups;
          sortGroups = x;
          chords = groups = null;
          return chord;
        };
        chord.sortSubgroups = function(x) {
          if (!arguments.length) return sortSubgroups;
          sortSubgroups = x;
          chords = null;
          return chord;
        };
        chord.sortChords = function(x) {
          if (!arguments.length) return sortChords;
          sortChords = x;
          if (chords) resort();
          return chord;
        };
        chord.chords = function() {
          if (!chords) relayout();
          return chords;
        };
        chord.groups = function() {
          if (!groups) relayout();
          return groups;
        };
        return chord;
      };
      d3.layout.force = function() {
        function repulse(node) {
          return function(quad, x1, y1, x2, y2) {
            if (quad.point !== node) {
              var dx = quad.cx - node.x, dy = quad.cy - node.y, dn = 1 / Math.sqrt(dx * dx + dy * dy);
              if ((x2 - x1) * dn < theta) {
                var k = quad.charge * dn * dn;
                node.px -= dx * k;
                node.py -= dy * k;
                return true;
              }
              if (quad.point && isFinite(dn)) {
                var k = quad.pointCharge * dn * dn;
                node.px -= dx * k;
                node.py -= dy * k;
              }
            }
            return !quad.charge;
          };
        }
        function dragmove(d) {
          d.px = d3.event.x;
          d.py = d3.event.y;
          force.resume();
        }
        var force = {}, event = d3.dispatch("start", "tick", "end"), size = [ 1, 1 ], drag, alpha, friction = .9, linkDistance = d3_layout_forceLinkDistance, linkStrength = d3_layout_forceLinkStrength, charge = -30, gravity = .1, theta = .8, interval, nodes = [], links = [], distances, strengths, charges;
        force.tick = function() {
          if ((alpha *= .99) < .005) {
            event.end({
              type: "end",
              alpha: alpha = 0
            });
            return true;
          }
          var n = nodes.length, m = links.length, q, i, o, s, t, l, k, x, y;
          for (i = 0; i < m; ++i) {
            o = links[i];
            s = o.source;
            t = o.target;
            x = t.x - s.x;
            y = t.y - s.y;
            if (l = x * x + y * y) {
              l = alpha * strengths[i] * ((l = Math.sqrt(l)) - distances[i]) / l;
              x *= l;
              y *= l;
              t.x -= x * (k = s.weight / (t.weight + s.weight));
              t.y -= y * k;
              s.x += x * (k = 1 - k);
              s.y += y * k;
            }
          }
          if (k = alpha * gravity) {
            x = size[0] / 2;
            y = size[1] / 2;
            i = -1;
            if (k) while (++i < n) {
              o = nodes[i];
              o.x += (x - o.x) * k;
              o.y += (y - o.y) * k;
            }
          }
          if (charge) {
            d3_layout_forceAccumulate(q = d3.geom.quadtree(nodes), alpha, charges);
            i = -1;
            while (++i < n) {
              if (!(o = nodes[i]).fixed) {
                q.visit(repulse(o));
              }
            }
          }
          i = -1;
          while (++i < n) {
            o = nodes[i];
            if (o.fixed) {
              o.x = o.px;
              o.y = o.py;
            } else {
              o.x -= (o.px - (o.px = o.x)) * friction;
              o.y -= (o.py - (o.py = o.y)) * friction;
            }
          }
          event.tick({
            type: "tick",
            alpha: alpha
          });
        };
        force.nodes = function(x) {
          if (!arguments.length) return nodes;
          nodes = x;
          return force;
        };
        force.links = function(x) {
          if (!arguments.length) return links;
          links = x;
          return force;
        };
        force.size = function(x) {
          if (!arguments.length) return size;
          size = x;
          return force;
        };
        force.linkDistance = function(x) {
          if (!arguments.length) return linkDistance;
          linkDistance = d3_functor(x);
          return force;
        };
        force.distance = force.linkDistance;
        force.linkStrength = function(x) {
          if (!arguments.length) return linkStrength;
          linkStrength = d3_functor(x);
          return force;
        };
        force.friction = function(x) {
          if (!arguments.length) return friction;
          friction = x;
          return force;
        };
        force.charge = function(x) {
          if (!arguments.length) return charge;
          charge = typeof x === "function" ? x : +x;
          return force;
        };
        force.gravity = function(x) {
          if (!arguments.length) return gravity;
          gravity = x;
          return force;
        };
        force.theta = function(x) {
          if (!arguments.length) return theta;
          theta = x;
          return force;
        };
        force.alpha = function(x) {
          if (!arguments.length) return alpha;
          if (alpha) {
            if (x > 0) alpha = x; else alpha = 0;
          } else if (x > 0) {
            event.start({
              type: "start",
              alpha: alpha = x
            });
            d3.timer(force.tick);
          }
          return force;
        };
        force.start = function() {
          function position(dimension, size) {
            var neighbors = neighbor(i), j = -1, m = neighbors.length, x;
            while (++j < m) if (!isNaN(x = neighbors[j][dimension])) return x;
            return Math.random() * size;
          }
          function neighbor() {
            if (!neighbors) {
              neighbors = [];
              for (j = 0; j < n; ++j) {
                neighbors[j] = [];
              }
              for (j = 0; j < m; ++j) {
                var o = links[j];
                neighbors[o.source.index].push(o.target);
                neighbors[o.target.index].push(o.source);
              }
            }
            return neighbors[i];
          }
          var i, j, n = nodes.length, m = links.length, w = size[0], h = size[1], neighbors, o;
          for (i = 0; i < n; ++i) {
            (o = nodes[i]).index = i;
            o.weight = 0;
          }
          distances = [];
          strengths = [];
          for (i = 0; i < m; ++i) {
            o = links[i];
            if (typeof o.source == "number") o.source = nodes[o.source];
            if (typeof o.target == "number") o.target = nodes[o.target];
            distances[i] = linkDistance.call(this, o, i);
            strengths[i] = linkStrength.call(this, o, i);
            ++o.source.weight;
            ++o.target.weight;
          }
          for (i = 0; i < n; ++i) {
            o = nodes[i];
            if (isNaN(o.x)) o.x = position("x", w);
            if (isNaN(o.y)) o.y = position("y", h);
            if (isNaN(o.px)) o.px = o.x;
            if (isNaN(o.py)) o.py = o.y;
          }
          charges = [];
          if (typeof charge === "function") {
            for (i = 0; i < n; ++i) {
              charges[i] = +charge.call(this, nodes[i], i);
            }
          } else {
            for (i = 0; i < n; ++i) {
              charges[i] = charge;
            }
          }
          return force.resume();
        };
        force.resume = function() {
          return force.alpha(.1);
        };
        force.stop = function() {
          return force.alpha(0);
        };
        force.drag = function() {
          if (!drag) drag = d3.behavior.drag().origin(d3_identity).on("dragstart", d3_layout_forceDragstart).on("drag", dragmove).on("dragend", d3_layout_forceDragend);
          this.on("mouseover.force", d3_layout_forceMouseover).on("mouseout.force", d3_layout_forceMouseout).call(drag);
        };
        return d3.rebind(force, event, "on");
      };
      d3.layout.partition = function() {
        function position(node, x, dx, dy) {
          var children = node.children;
          node.x = x;
          node.y = node.depth * dy;
          node.dx = dx;
          node.dy = dy;
          if (children && (n = children.length)) {
            var i = -1, n, c, d;
            dx = node.value ? dx / node.value : 0;
            while (++i < n) {
              position(c = children[i], x, d = c.value * dx, dy);
              x += d;
            }
          }
        }
        function depth(node) {
          var children = node.children, d = 0;
          if (children && (n = children.length)) {
            var i = -1, n;
            while (++i < n) d = Math.max(d, depth(children[i]));
          }
          return 1 + d;
        }
        function partition(d, i) {
          var nodes = hierarchy.call(this, d, i);
          position(nodes[0], 0, size[0], size[1] / depth(nodes[0]));
          return nodes;
        }
        var hierarchy = d3.layout.hierarchy(), size = [ 1, 1 ];
        partition.size = function(x) {
          if (!arguments.length) return size;
          size = x;
          return partition;
        };
        return d3_layout_hierarchyRebind(partition, hierarchy);
      };
      d3.layout.pie = function() {
        function pie(data, i) {
          var values = data.map(function(d, i) {
            return +value.call(pie, d, i);
          });
          var a = +(typeof startAngle === "function" ? startAngle.apply(this, arguments) : startAngle);
          var k = ((typeof endAngle === "function" ? endAngle.apply(this, arguments) : endAngle) - startAngle) / d3.sum(values);
          var index = d3.range(data.length);
          if (sort != null) index.sort(sort === d3_layout_pieSortByValue ? function(i, j) {
            return values[j] - values[i];
          } : function(i, j) {
            return sort(data[i], data[j]);
          });
          var arcs = [];
          index.forEach(function(i) {
            var d;
            arcs[i] = {
              data: data[i],
              value: d = values[i],
              startAngle: a,
              endAngle: a += d * k
            };
          });
          return arcs;
        }
        var value = Number, sort = d3_layout_pieSortByValue, startAngle = 0, endAngle = 2 * Math.PI;
        pie.value = function(x) {
          if (!arguments.length) return value;
          value = x;
          return pie;
        };
        pie.sort = function(x) {
          if (!arguments.length) return sort;
          sort = x;
          return pie;
        };
        pie.startAngle = function(x) {
          if (!arguments.length) return startAngle;
          startAngle = x;
          return pie;
        };
        pie.endAngle = function(x) {
          if (!arguments.length) return endAngle;
          endAngle = x;
          return pie;
        };
        return pie;
      };
      var d3_layout_pieSortByValue = {};
      d3.layout.stack = function() {
        function stack(data, index) {
          var series = data.map(function(d, i) {
            return values.call(stack, d, i);
          });
          var points = series.map(function(d, i) {
            return d.map(function(v, i) {
              return [ x.call(stack, v, i), y.call(stack, v, i) ];
            });
          });
          var orders = order.call(stack, points, index);
          series = d3.permute(series, orders);
          points = d3.permute(points, orders);
          var offsets = offset.call(stack, points, index);
          var n = series.length, m = series[0].length, i, j, o;
          for (j = 0; j < m; ++j) {
            out.call(stack, series[0][j], o = offsets[j], points[0][j][1]);
            for (i = 1; i < n; ++i) {
              out.call(stack, series[i][j], o += points[i - 1][j][1], points[i][j][1]);
            }
          }
          return data;
        }
        var values = d3_identity, order = d3_layout_stackOrderDefault, offset = d3_layout_stackOffsetZero, out = d3_layout_stackOut, x = d3_layout_stackX, y = d3_layout_stackY;
        stack.values = function(x) {
          if (!arguments.length) return values;
          values = x;
          return stack;
        };
        stack.order = function(x) {
          if (!arguments.length) return order;
          order = typeof x === "function" ? x : d3_layout_stackOrders.get(x) || d3_layout_stackOrderDefault;
          return stack;
        };
        stack.offset = function(x) {
          if (!arguments.length) return offset;
          offset = typeof x === "function" ? x : d3_layout_stackOffsets.get(x) || d3_layout_stackOffsetZero;
          return stack;
        };
        stack.x = function(z) {
          if (!arguments.length) return x;
          x = z;
          return stack;
        };
        stack.y = function(z) {
          if (!arguments.length) return y;
          y = z;
          return stack;
        };
        stack.out = function(z) {
          if (!arguments.length) return out;
          out = z;
          return stack;
        };
        return stack;
      };
      var d3_layout_stackOrders = d3.map({
        "inside-out": function(data) {
          var n = data.length, i, j, max = data.map(d3_layout_stackMaxIndex), sums = data.map(d3_layout_stackReduceSum), index = d3.range(n).sort(function(a, b) {
            return max[a] - max[b];
          }), top = 0, bottom = 0, tops = [], bottoms = [];
          for (i = 0; i < n; ++i) {
            j = index[i];
            if (top < bottom) {
              top += sums[j];
              tops.push(j);
            } else {
              bottom += sums[j];
              bottoms.push(j);
            }
          }
          return bottoms.reverse().concat(tops);
        },
        reverse: function(data) {
          return d3.range(data.length).reverse();
        },
        "default": d3_layout_stackOrderDefault
      });
      var d3_layout_stackOffsets = d3.map({
        silhouette: function(data) {
          var n = data.length, m = data[0].length, sums = [], max = 0, i, j, o, y0 = [];
          for (j = 0; j < m; ++j) {
            for (i = 0, o = 0; i < n; i++) o += data[i][j][1];
            if (o > max) max = o;
            sums.push(o);
          }
          for (j = 0; j < m; ++j) {
            y0[j] = (max - sums[j]) / 2;
          }
          return y0;
        },
        wiggle: function(data) {
          var n = data.length, x = data[0], m = x.length, max = 0, i, j, k, s1, s2, s3, dx, o, o0, y0 = [];
          y0[0] = o = o0 = 0;
          for (j = 1; j < m; ++j) {
            for (i = 0, s1 = 0; i < n; ++i) s1 += data[i][j][1];
            for (i = 0, s2 = 0, dx = x[j][0] - x[j - 1][0]; i < n; ++i) {
              for (k = 0, s3 = (data[i][j][1] - data[i][j - 1][1]) / (2 * dx); k < i; ++k) {
                s3 += (data[k][j][1] - data[k][j - 1][1]) / dx;
              }
              s2 += s3 * data[i][j][1];
            }
            y0[j] = o -= s1 ? s2 / s1 * dx : 0;
            if (o < o0) o0 = o;
          }
          for (j = 0; j < m; ++j) y0[j] -= o0;
          return y0;
        },
        expand: function(data) {
          var n = data.length, m = data[0].length, k = 1 / n, i, j, o, y0 = [];
          for (j = 0; j < m; ++j) {
            for (i = 0, o = 0; i < n; i++) o += data[i][j][1];
            if (o) for (i = 0; i < n; i++) data[i][j][1] /= o; else for (i = 0; i < n; i++) data[i][j][1] = k;
          }
          for (j = 0; j < m; ++j) y0[j] = 0;
          return y0;
        },
        zero: d3_layout_stackOffsetZero
      });
      d3.layout.histogram = function() {
        function histogram(data, i) {
          var bins = [], values = data.map(valuer, this), range = ranger.call(this, values, i), thresholds = binner.call(this, range, values, i), bin, i = -1, n = values.length, m = thresholds.length - 1, k = frequency ? 1 : 1 / n, x;
          while (++i < m) {
            bin = bins[i] = [];
            bin.dx = thresholds[i + 1] - (bin.x = thresholds[i]);
            bin.y = 0;
          }
          if (m > 0) {
            i = -1;
            while (++i < n) {
              x = values[i];
              if (x >= range[0] && x <= range[1]) {
                bin = bins[d3.bisect(thresholds, x, 1, m) - 1];
                bin.y += k;
                bin.push(data[i]);
              }
            }
          }
          return bins;
        }
        var frequency = true, valuer = Number, ranger = d3_layout_histogramRange, binner = d3_layout_histogramBinSturges;
        histogram.value = function(x) {
          if (!arguments.length) return valuer;
          valuer = x;
          return histogram;
        };
        histogram.range = function(x) {
          if (!arguments.length) return ranger;
          ranger = d3_functor(x);
          return histogram;
        };
        histogram.bins = function(x) {
          if (!arguments.length) return binner;
          binner = typeof x === "number" ? function(range) {
            return d3_layout_histogramBinFixed(range, x);
          } : d3_functor(x);
          return histogram;
        };
        histogram.frequency = function(x) {
          if (!arguments.length) return frequency;
          frequency = !!x;
          return histogram;
        };
        return histogram;
      };
      d3.layout.hierarchy = function() {
        function recurse(data, depth, nodes) {
          var childs = children.call(hierarchy, data, depth), node = d3_layout_hierarchyInline ? data : {
            data: data
          };
          node.depth = depth;
          nodes.push(node);
          if (childs && (n = childs.length)) {
            var i = -1, n, c = node.children = [], v = 0, j = depth + 1, d;
            while (++i < n) {
              d = recurse(childs[i], j, nodes);
              d.parent = node;
              c.push(d);
              v += d.value;
            }
            if (sort) c.sort(sort);
            if (value) node.value = v;
          } else if (value) {
            node.value = +value.call(hierarchy, data, depth) || 0;
          }
          return node;
        }
        function revalue(node, depth) {
          var children = node.children, v = 0;
          if (children && (n = children.length)) {
            var i = -1, n, j = depth + 1;
            while (++i < n) v += revalue(children[i], j);
          } else if (value) {
            v = +value.call(hierarchy, d3_layout_hierarchyInline ? node : node.data, depth) || 0;
          }
          if (value) node.value = v;
          return v;
        }
        function hierarchy(d) {
          var nodes = [];
          recurse(d, 0, nodes);
          return nodes;
        }
        var sort = d3_layout_hierarchySort, children = d3_layout_hierarchyChildren, value = d3_layout_hierarchyValue;
        hierarchy.sort = function(x) {
          if (!arguments.length) return sort;
          sort = x;
          return hierarchy;
        };
        hierarchy.children = function(x) {
          if (!arguments.length) return children;
          children = x;
          return hierarchy;
        };
        hierarchy.value = function(x) {
          if (!arguments.length) return value;
          value = x;
          return hierarchy;
        };
        hierarchy.revalue = function(root) {
          revalue(root, 0);
          return root;
        };
        return hierarchy;
      };
      var d3_layout_hierarchyInline = false;
      d3.layout.pack = function() {
        function pack(d, i) {
          var nodes = hierarchy.call(this, d, i), root = nodes[0];
          root.x = 0;
          root.y = 0;
          d3_layout_treeVisitAfter(root, function(d) {
            d.r = Math.sqrt(d.value);
          });
          d3_layout_treeVisitAfter(root, d3_layout_packSiblings);
          var w = size[0], h = size[1], k = Math.max(2 * root.r / w, 2 * root.r / h);
          if (padding > 0) {
            var dr = padding * k / 2;
            d3_layout_treeVisitAfter(root, function(d) {
              d.r += dr;
            });
            d3_layout_treeVisitAfter(root, d3_layout_packSiblings);
            d3_layout_treeVisitAfter(root, function(d) {
              d.r -= dr;
            });
            k = Math.max(2 * root.r / w, 2 * root.r / h);
          }
          d3_layout_packTransform(root, w / 2, h / 2, 1 / k);
          return nodes;
        }
        var hierarchy = d3.layout.hierarchy().sort(d3_layout_packSort), padding = 0, size = [ 1, 1 ];
        pack.size = function(x) {
          if (!arguments.length) return size;
          size = x;
          return pack;
        };
        pack.padding = function(_) {
          if (!arguments.length) return padding;
          padding = +_;
          return pack;
        };
        return d3_layout_hierarchyRebind(pack, hierarchy);
      };
      d3.layout.cluster = function() {
        function cluster(d, i) {
          var nodes = hierarchy.call(this, d, i), root = nodes[0], previousNode, x = 0, kx, ky;
          d3_layout_treeVisitAfter(root, function(node) {
            var children = node.children;
            if (children && children.length) {
              node.x = d3_layout_clusterX(children);
              node.y = d3_layout_clusterY(children);
            } else {
              node.x = previousNode ? x += separation(node, previousNode) : 0;
              node.y = 0;
              previousNode = node;
            }
          });
          var left = d3_layout_clusterLeft(root), right = d3_layout_clusterRight(root), x0 = left.x - separation(left, right) / 2, x1 = right.x + separation(right, left) / 2;
          d3_layout_treeVisitAfter(root, function(node) {
            node.x = (node.x - x0) / (x1 - x0) * size[0];
            node.y = (1 - (root.y ? node.y / root.y : 1)) * size[1];
          });
          return nodes;
        }
        var hierarchy = d3.layout.hierarchy().sort(null).value(null), separation = d3_layout_treeSeparation, size = [ 1, 1 ];
        cluster.separation = function(x) {
          if (!arguments.length) return separation;
          separation = x;
          return cluster;
        };
        cluster.size = function(x) {
          if (!arguments.length) return size;
          size = x;
          return cluster;
        };
        return d3_layout_hierarchyRebind(cluster, hierarchy);
      };
      d3.layout.tree = function() {
        function tree(d, i) {
          function firstWalk(node, previousSibling) {
            var children = node.children, layout = node._tree;
            if (children && (n = children.length)) {
              var n, firstChild = children[0], previousChild, ancestor = firstChild, child, i = -1;
              while (++i < n) {
                child = children[i];
                firstWalk(child, previousChild);
                ancestor = apportion(child, previousChild, ancestor);
                previousChild = child;
              }
              d3_layout_treeShift(node);
              var midpoint = .5 * (firstChild._tree.prelim + child._tree.prelim);
              if (previousSibling) {
                layout.prelim = previousSibling._tree.prelim + separation(node, previousSibling);
                layout.mod = layout.prelim - midpoint;
              } else {
                layout.prelim = midpoint;
              }
            } else {
              if (previousSibling) {
                layout.prelim = previousSibling._tree.prelim + separation(node, previousSibling);
              }
            }
          }
          function secondWalk(node, x) {
            node.x = node._tree.prelim + x;
            var children = node.children;
            if (children && (n = children.length)) {
              var i = -1, n;
              x += node._tree.mod;
              while (++i < n) {
                secondWalk(children[i], x);
              }
            }
          }
          function apportion(node, previousSibling, ancestor) {
            if (previousSibling) {
              var vip = node, vop = node, vim = previousSibling, vom = node.parent.children[0], sip = vip._tree.mod, sop = vop._tree.mod, sim = vim._tree.mod, som = vom._tree.mod, shift;
              while (vim = d3_layout_treeRight(vim), vip = d3_layout_treeLeft(vip), vim && vip) {
                vom = d3_layout_treeLeft(vom);
                vop = d3_layout_treeRight(vop);
                vop._tree.ancestor = node;
                shift = vim._tree.prelim + sim - vip._tree.prelim - sip + separation(vim, vip);
                if (shift > 0) {
                  d3_layout_treeMove(d3_layout_treeAncestor(vim, node, ancestor), node, shift);
                  sip += shift;
                  sop += shift;
                }
                sim += vim._tree.mod;
                sip += vip._tree.mod;
                som += vom._tree.mod;
                sop += vop._tree.mod;
              }
              if (vim && !d3_layout_treeRight(vop)) {
                vop._tree.thread = vim;
                vop._tree.mod += sim - sop;
              }
              if (vip && !d3_layout_treeLeft(vom)) {
                vom._tree.thread = vip;
                vom._tree.mod += sip - som;
                ancestor = node;
              }
            }
            return ancestor;
          }
          var nodes = hierarchy.call(this, d, i), root = nodes[0];
          d3_layout_treeVisitAfter(root, function(node, previousSibling) {
            node._tree = {
              ancestor: node,
              prelim: 0,
              mod: 0,
              change: 0,
              shift: 0,
              number: previousSibling ? previousSibling._tree.number + 1 : 0
            };
          });
          firstWalk(root);
          secondWalk(root, -root._tree.prelim);
          var left = d3_layout_treeSearch(root, d3_layout_treeLeftmost), right = d3_layout_treeSearch(root, d3_layout_treeRightmost), deep = d3_layout_treeSearch(root, d3_layout_treeDeepest), x0 = left.x - separation(left, right) / 2, x1 = right.x + separation(right, left) / 2, y1 = deep.depth || 1;
          d3_layout_treeVisitAfter(root, function(node) {
            node.x = (node.x - x0) / (x1 - x0) * size[0];
            node.y = node.depth / y1 * size[1];
            delete node._tree;
          });
          return nodes;
        }
        var hierarchy = d3.layout.hierarchy().sort(null).value(null), separation = d3_layout_treeSeparation, size = [ 1, 1 ];
        tree.separation = function(x) {
          if (!arguments.length) return separation;
          separation = x;
          return tree;
        };
        tree.size = function(x) {
          if (!arguments.length) return size;
          size = x;
          return tree;
        };
        return d3_layout_hierarchyRebind(tree, hierarchy);
      };
      d3.layout.treemap = function() {
        function scale(children, k) {
          var i = -1, n = children.length, child, area;
          while (++i < n) {
            area = (child = children[i]).value * (k < 0 ? 0 : k);
            child.area = isNaN(area) || area <= 0 ? 0 : area;
          }
        }
        function squarify(node) {
          var children = node.children;
          if (children && children.length) {
            var rect = pad(node), row = [], remaining = children.slice(), child, best = Infinity, score, u = Math.min(rect.dx, rect.dy), n;
            scale(remaining, rect.dx * rect.dy / node.value);
            row.area = 0;
            while ((n = remaining.length) > 0) {
              row.push(child = remaining[n - 1]);
              row.area += child.area;
              if ((score = worst(row, u)) <= best) {
                remaining.pop();
                best = score;
              } else {
                row.area -= row.pop().area;
                position(row, u, rect, false);
                u = Math.min(rect.dx, rect.dy);
                row.length = row.area = 0;
                best = Infinity;
              }
            }
            if (row.length) {
              position(row, u, rect, true);
              row.length = row.area = 0;
            }
            children.forEach(squarify);
          }
        }
        function stickify(node) {
          var children = node.children;
          if (children && children.length) {
            var rect = pad(node), remaining = children.slice(), child, row = [];
            scale(remaining, rect.dx * rect.dy / node.value);
            row.area = 0;
            while (child = remaining.pop()) {
              row.push(child);
              row.area += child.area;
              if (child.z != null) {
                position(row, child.z ? rect.dx : rect.dy, rect, !remaining.length);
                row.length = row.area = 0;
              }
            }
            children.forEach(stickify);
          }
        }
        function worst(row, u) {
          var s = row.area, r, rmax = 0, rmin = Infinity, i = -1, n = row.length;
          while (++i < n) {
            if (!(r = row[i].area)) continue;
            if (r < rmin) rmin = r;
            if (r > rmax) rmax = r;
          }
          s *= s;
          u *= u;
          return s ? Math.max(u * rmax * ratio / s, s / (u * rmin * ratio)) : Infinity;
        }
        function position(row, u, rect, flush) {
          var i = -1, n = row.length, x = rect.x, y = rect.y, v = u ? round(row.area / u) : 0, o;
          if (u == rect.dx) {
            if (flush || v > rect.dy) v = rect.dy;
            while (++i < n) {
              o = row[i];
              o.x = x;
              o.y = y;
              o.dy = v;
              x += o.dx = Math.min(rect.x + rect.dx - x, v ? round(o.area / v) : 0);
            }
            o.z = true;
            o.dx += rect.x + rect.dx - x;
            rect.y += v;
            rect.dy -= v;
          } else {
            if (flush || v > rect.dx) v = rect.dx;
            while (++i < n) {
              o = row[i];
              o.x = x;
              o.y = y;
              o.dx = v;
              y += o.dy = Math.min(rect.y + rect.dy - y, v ? round(o.area / v) : 0);
            }
            o.z = false;
            o.dy += rect.y + rect.dy - y;
            rect.x += v;
            rect.dx -= v;
          }
        }
        function treemap(d) {
          var nodes = stickies || hierarchy(d), root = nodes[0];
          root.x = 0;
          root.y = 0;
          root.dx = size[0];
          root.dy = size[1];
          if (stickies) hierarchy.revalue(root);
          scale([ root ], root.dx * root.dy / root.value);
          (stickies ? stickify : squarify)(root);
          if (sticky) stickies = nodes;
          return nodes;
        }
        var hierarchy = d3.layout.hierarchy(), round = Math.round, size = [ 1, 1 ], padding = null, pad = d3_layout_treemapPadNull, sticky = false, stickies, ratio = .5 * (1 + Math.sqrt(5));
        treemap.size = function(x) {
          if (!arguments.length) return size;
          size = x;
          return treemap;
        };
        treemap.padding = function(x) {
          function padFunction(node) {
            var p = x.call(treemap, node, node.depth);
            return p == null ? d3_layout_treemapPadNull(node) : d3_layout_treemapPad(node, typeof p === "number" ? [ p, p, p, p ] : p);
          }
          function padConstant(node) {
            return d3_layout_treemapPad(node, x);
          }
          if (!arguments.length) return padding;
          var type;
          pad = (padding = x) == null ? d3_layout_treemapPadNull : (type = typeof x) === "function" ? padFunction : type === "number" ? (x = [ x, x, x, x ], padConstant) : padConstant;
          return treemap;
        };
        treemap.round = function(x) {
          if (!arguments.length) return round != Number;
          round = x ? Math.round : Number;
          return treemap;
        };
        treemap.sticky = function(x) {
          if (!arguments.length) return sticky;
          sticky = x;
          stickies = null;
          return treemap;
        };
        treemap.ratio = function(x) {
          if (!arguments.length) return ratio;
          ratio = x;
          return treemap;
        };
        return d3_layout_hierarchyRebind(treemap, hierarchy);
      };
      d3.csv = d3_dsv(",", "text/csv");
      d3.tsv = d3_dsv("	", "text/tab-separated-values");
      d3.geo = {};
      var d3_geo_radians = Math.PI / 180;
      d3.geo.azimuthal = function() {
        function azimuthal(coordinates) {
          var x1 = coordinates[0] * d3_geo_radians - x0, y1 = coordinates[1] * d3_geo_radians, cx1 = Math.cos(x1), sx1 = Math.sin(x1), cy1 = Math.cos(y1), sy1 = Math.sin(y1), cc = mode !== "orthographic" ? sy0 * sy1 + cy0 * cy1 * cx1 : null, c, k = mode === "stereographic" ? 1 / (1 + cc) : mode === "gnomonic" ? 1 / cc : mode === "equidistant" ? (c = Math.acos(cc), c ? c / Math.sin(c) : 0) : mode === "equalarea" ? Math.sqrt(2 / (1 + cc)) : 1, x = k * cy1 * sx1, y = k * (sy0 * cy1 * cx1 - cy0 * sy1);
          return [ scale * x + translate[0], scale * y + translate[1] ];
        }
        var mode = "orthographic", origin, scale = 200, translate = [ 480, 250 ], x0, y0, cy0, sy0;
        azimuthal.invert = function(coordinates) {
          var x = (coordinates[0] - translate[0]) / scale, y = (coordinates[1] - translate[1]) / scale, p = Math.sqrt(x * x + y * y), c = mode === "stereographic" ? 2 * Math.atan(p) : mode === "gnomonic" ? Math.atan(p) : mode === "equidistant" ? p : mode === "equalarea" ? 2 * Math.asin(.5 * p) : Math.asin(p), sc = Math.sin(c), cc = Math.cos(c);
          return [ (x0 + Math.atan2(x * sc, p * cy0 * cc + y * sy0 * sc)) / d3_geo_radians, Math.asin(cc * sy0 - (p ? y * sc * cy0 / p : 0)) / d3_geo_radians ];
        };
        azimuthal.mode = function(x) {
          if (!arguments.length) return mode;
          mode = x + "";
          return azimuthal;
        };
        azimuthal.origin = function(x) {
          if (!arguments.length) return origin;
          origin = x;
          x0 = origin[0] * d3_geo_radians;
          y0 = origin[1] * d3_geo_radians;
          cy0 = Math.cos(y0);
          sy0 = Math.sin(y0);
          return azimuthal;
        };
        azimuthal.scale = function(x) {
          if (!arguments.length) return scale;
          scale = +x;
          return azimuthal;
        };
        azimuthal.translate = function(x) {
          if (!arguments.length) return translate;
          translate = [ +x[0], +x[1] ];
          return azimuthal;
        };
        return azimuthal.origin([ 0, 0 ]);
      };
      d3.geo.albers = function() {
        function albers(coordinates) {
          var t = n * (d3_geo_radians * coordinates[0] - lng0), p = Math.sqrt(C - 2 * n * Math.sin(d3_geo_radians * coordinates[1])) / n;
          return [ scale * p * Math.sin(t) + translate[0], scale * (p * Math.cos(t) - p0) + translate[1] ];
        }
        function reload() {
          var phi1 = d3_geo_radians * parallels[0], phi2 = d3_geo_radians * parallels[1], lat0 = d3_geo_radians * origin[1], s = Math.sin(phi1), c = Math.cos(phi1);
          lng0 = d3_geo_radians * origin[0];
          n = .5 * (s + Math.sin(phi2));
          C = c * c + 2 * n * s;
          p0 = Math.sqrt(C - 2 * n * Math.sin(lat0)) / n;
          return albers;
        }
        var origin = [ -98, 38 ], parallels = [ 29.5, 45.5 ], scale = 1e3, translate = [ 480, 250 ], lng0, n, C, p0;
        albers.invert = function(coordinates) {
          var x = (coordinates[0] - translate[0]) / scale, y = (coordinates[1] - translate[1]) / scale, p0y = p0 + y, t = Math.atan2(x, p0y), p = Math.sqrt(x * x + p0y * p0y);
          return [ (lng0 + t / n) / d3_geo_radians, Math.asin((C - p * p * n * n) / (2 * n)) / d3_geo_radians ];
        };
        albers.origin = function(x) {
          if (!arguments.length) return origin;
          origin = [ +x[0], +x[1] ];
          return reload();
        };
        albers.parallels = function(x) {
          if (!arguments.length) return parallels;
          parallels = [ +x[0], +x[1] ];
          return reload();
        };
        albers.scale = function(x) {
          if (!arguments.length) return scale;
          scale = +x;
          return albers;
        };
        albers.translate = function(x) {
          if (!arguments.length) return translate;
          translate = [ +x[0], +x[1] ];
          return albers;
        };
        return reload();
      };
      d3.geo.albersUsa = function() {
        function albersUsa(coordinates) {
          var lon = coordinates[0], lat = coordinates[1];
          return (lat > 50 ? alaska : lon < -140 ? hawaii : lat < 21 ? puertoRico : lower48)(coordinates);
        }
        var lower48 = d3.geo.albers();
        var alaska = d3.geo.albers().origin([ -160, 60 ]).parallels([ 55, 65 ]);
        var hawaii = d3.geo.albers().origin([ -160, 20 ]).parallels([ 8, 18 ]);
        var puertoRico = d3.geo.albers().origin([ -60, 10 ]).parallels([ 8, 18 ]);
        albersUsa.scale = function(x) {
          if (!arguments.length) return lower48.scale();
          lower48.scale(x);
          alaska.scale(x * .6);
          hawaii.scale(x);
          puertoRico.scale(x * 1.5);
          return albersUsa.translate(lower48.translate());
        };
        albersUsa.translate = function(x) {
          if (!arguments.length) return lower48.translate();
          var dz = lower48.scale() / 1e3, dx = x[0], dy = x[1];
          lower48.translate(x);
          alaska.translate([ dx - 400 * dz, dy + 170 * dz ]);
          hawaii.translate([ dx - 190 * dz, dy + 200 * dz ]);
          puertoRico.translate([ dx + 580 * dz, dy + 430 * dz ]);
          return albersUsa;
        };
        return albersUsa.scale(lower48.scale());
      };
      d3.geo.bonne = function() {
        function bonne(coordinates) {
          var x = coordinates[0] * d3_geo_radians - x0, y = coordinates[1] * d3_geo_radians - y0;
          if (y1) {
            var p = c1 + y1 - y, E = x * Math.cos(y) / p;
            x = p * Math.sin(E);
            y = p * Math.cos(E) - c1;
          } else {
            x *= Math.cos(y);
            y *= -1;
          }
          return [ scale * x + translate[0], scale * y + translate[1] ];
        }
        var scale = 200, translate = [ 480, 250 ], x0, y0, y1, c1;
        bonne.invert = function(coordinates) {
          var x = (coordinates[0] - translate[0]) / scale, y = (coordinates[1] - translate[1]) / scale;
          if (y1) {
            var c = c1 + y, p = Math.sqrt(x * x + c * c);
            y = c1 + y1 - p;
            x = x0 + p * Math.atan2(x, c) / Math.cos(y);
          } else {
            y *= -1;
            x /= Math.cos(y);
          }
          return [ x / d3_geo_radians, y / d3_geo_radians ];
        };
        bonne.parallel = function(x) {
          if (!arguments.length) return y1 / d3_geo_radians;
          c1 = 1 / Math.tan(y1 = x * d3_geo_radians);
          return bonne;
        };
        bonne.origin = function(x) {
          if (!arguments.length) return [ x0 / d3_geo_radians, y0 / d3_geo_radians ];
          x0 = x[0] * d3_geo_radians;
          y0 = x[1] * d3_geo_radians;
          return bonne;
        };
        bonne.scale = function(x) {
          if (!arguments.length) return scale;
          scale = +x;
          return bonne;
        };
        bonne.translate = function(x) {
          if (!arguments.length) return translate;
          translate = [ +x[0], +x[1] ];
          return bonne;
        };
        return bonne.origin([ 0, 0 ]).parallel(45);
      };
      d3.geo.equirectangular = function() {
        function equirectangular(coordinates) {
          var x = coordinates[0] / 360, y = -coordinates[1] / 360;
          return [ scale * x + translate[0], scale * y + translate[1] ];
        }
        var scale = 500, translate = [ 480, 250 ];
        equirectangular.invert = function(coordinates) {
          var x = (coordinates[0] - translate[0]) / scale, y = (coordinates[1] - translate[1]) / scale;
          return [ 360 * x, -360 * y ];
        };
        equirectangular.scale = function(x) {
          if (!arguments.length) return scale;
          scale = +x;
          return equirectangular;
        };
        equirectangular.translate = function(x) {
          if (!arguments.length) return translate;
          translate = [ +x[0], +x[1] ];
          return equirectangular;
        };
        return equirectangular;
      };
      d3.geo.mercator = function() {
        function mercator(coordinates) {
          var x = coordinates[0] / 360, y = -(Math.log(Math.tan(Math.PI / 4 + coordinates[1] * d3_geo_radians / 2)) / d3_geo_radians) / 360;
          return [ scale * x + translate[0], scale * Math.max(-.5, Math.min(.5, y)) + translate[1] ];
        }
        var scale = 500, translate = [ 480, 250 ];
        mercator.invert = function(coordinates) {
          var x = (coordinates[0] - translate[0]) / scale, y = (coordinates[1] - translate[1]) / scale;
          return [ 360 * x, 2 * Math.atan(Math.exp(-360 * y * d3_geo_radians)) / d3_geo_radians - 90 ];
        };
        mercator.scale = function(x) {
          if (!arguments.length) return scale;
          scale = +x;
          return mercator;
        };
        mercator.translate = function(x) {
          if (!arguments.length) return translate;
          translate = [ +x[0], +x[1] ];
          return mercator;
        };
        return mercator;
      };
      d3.geo.path = function() {
        function path(d, i) {
          if (typeof pointRadius === "function") pointCircle = d3_path_circle(pointRadius.apply(this, arguments));
          pathType(d);
          var result = buffer.length ? buffer.join("") : null;
          buffer = [];
          return result;
        }
        function project(coordinates) {
          return projection(coordinates).join(",");
        }
        function polygonArea(coordinates) {
          var sum = area(coordinates[0]), i = 0, n = coordinates.length;
          while (++i < n) sum -= area(coordinates[i]);
          return sum;
        }
        function polygonCentroid(coordinates) {
          var polygon = d3.geom.polygon(coordinates[0].map(projection)), area = polygon.area(), centroid = polygon.centroid(area < 0 ? (area *= -1, 1) : -1), x = centroid[0], y = centroid[1], z = area, i = 0, n = coordinates.length;
          while (++i < n) {
            polygon = d3.geom.polygon(coordinates[i].map(projection));
            area = polygon.area();
            centroid = polygon.centroid(area < 0 ? (area *= -1, 1) : -1);
            x -= centroid[0];
            y -= centroid[1];
            z -= area;
          }
          return [ x, y, 6 * z ];
        }
        function area(coordinates) {
          return Math.abs(d3.geom.polygon(coordinates.map(projection)).area());
        }
        var pointRadius = 4.5, pointCircle = d3_path_circle(pointRadius), projection = d3.geo.albersUsa(), buffer = [];
        var pathType = d3_geo_type({
          FeatureCollection: function(o) {
            var features = o.features, i = -1, n = features.length;
            while (++i < n) buffer.push(pathType(features[i].geometry));
          },
          Feature: function(o) {
            pathType(o.geometry);
          },
          Point: function(o) {
            buffer.push("M", project(o.coordinates), pointCircle);
          },
          MultiPoint: function(o) {
            var coordinates = o.coordinates, i = -1, n = coordinates.length;
            while (++i < n) buffer.push("M", project(coordinates[i]), pointCircle);
          },
          LineString: function(o) {
            var coordinates = o.coordinates, i = -1, n = coordinates.length;
            buffer.push("M");
            while (++i < n) buffer.push(project(coordinates[i]), "L");
            buffer.pop();
          },
          MultiLineString: function(o) {
            var coordinates = o.coordinates, i = -1, n = coordinates.length, subcoordinates, j, m;
            while (++i < n) {
              subcoordinates = coordinates[i];
              j = -1;
              m = subcoordinates.length;
              buffer.push("M");
              while (++j < m) buffer.push(project(subcoordinates[j]), "L");
              buffer.pop();
            }
          },
          Polygon: function(o) {
            var coordinates = o.coordinates, i = -1, n = coordinates.length, subcoordinates, j, m;
            while (++i < n) {
              subcoordinates = coordinates[i];
              j = -1;
              if ((m = subcoordinates.length - 1) > 0) {
                buffer.push("M");
                while (++j < m) buffer.push(project(subcoordinates[j]), "L");
                buffer[buffer.length - 1] = "Z";
              }
            }
          },
          MultiPolygon: function(o) {
            var coordinates = o.coordinates, i = -1, n = coordinates.length, subcoordinates, j, m, subsubcoordinates, k, p;
            while (++i < n) {
              subcoordinates = coordinates[i];
              j = -1;
              m = subcoordinates.length;
              while (++j < m) {
                subsubcoordinates = subcoordinates[j];
                k = -1;
                if ((p = subsubcoordinates.length - 1) > 0) {
                  buffer.push("M");
                  while (++k < p) buffer.push(project(subsubcoordinates[k]), "L");
                  buffer[buffer.length - 1] = "Z";
                }
              }
            }
          },
          GeometryCollection: function(o) {
            var geometries = o.geometries, i = -1, n = geometries.length;
            while (++i < n) buffer.push(pathType(geometries[i]));
          }
        });
        var areaType = path.area = d3_geo_type({
          FeatureCollection: function(o) {
            var area = 0, features = o.features, i = -1, n = features.length;
            while (++i < n) area += areaType(features[i]);
            return area;
          },
          Feature: function(o) {
            return areaType(o.geometry);
          },
          Polygon: function(o) {
            return polygonArea(o.coordinates);
          },
          MultiPolygon: function(o) {
            var sum = 0, coordinates = o.coordinates, i = -1, n = coordinates.length;
            while (++i < n) sum += polygonArea(coordinates[i]);
            return sum;
          },
          GeometryCollection: function(o) {
            var sum = 0, geometries = o.geometries, i = -1, n = geometries.length;
            while (++i < n) sum += areaType(geometries[i]);
            return sum;
          }
        }, 0);
        var centroidType = path.centroid = d3_geo_type({
          Feature: function(o) {
            return centroidType(o.geometry);
          },
          Polygon: function(o) {
            var centroid = polygonCentroid(o.coordinates);
            return [ centroid[0] / centroid[2], centroid[1] / centroid[2] ];
          },
          MultiPolygon: function(o) {
            var area = 0, coordinates = o.coordinates, centroid, x = 0, y = 0, z = 0, i = -1, n = coordinates.length;
            while (++i < n) {
              centroid = polygonCentroid(coordinates[i]);
              x += centroid[0];
              y += centroid[1];
              z += centroid[2];
            }
            return [ x / z, y / z ];
          }
        });
        path.projection = function(x) {
          projection = x;
          return path;
        };
        path.pointRadius = function(x) {
          if (typeof x === "function") pointRadius = x; else {
            pointRadius = +x;
            pointCircle = d3_path_circle(pointRadius);
          }
          return path;
        };
        return path;
      };
      d3.geo.bounds = function(feature) {
        var left = Infinity, bottom = Infinity, right = -Infinity, top = -Infinity;
        d3_geo_bounds(feature, function(x, y) {
          if (x < left) left = x;
          if (x > right) right = x;
          if (y < bottom) bottom = y;
          if (y > top) top = y;
        });
        return [ [ left, bottom ], [ right, top ] ];
      };
      var d3_geo_boundsTypes = {
        Feature: d3_geo_boundsFeature,
        FeatureCollection: d3_geo_boundsFeatureCollection,
        GeometryCollection: d3_geo_boundsGeometryCollection,
        LineString: d3_geo_boundsLineString,
        MultiLineString: d3_geo_boundsMultiLineString,
        MultiPoint: d3_geo_boundsLineString,
        MultiPolygon: d3_geo_boundsMultiPolygon,
        Point: d3_geo_boundsPoint,
        Polygon: d3_geo_boundsPolygon
      };
      d3.geo.circle = function() {
        function circle() {}
        function visible(point) {
          return arc.distance(point) < radians;
        }
        function clip(coordinates) {
          var i = -1, n = coordinates.length, clipped = [], p0, p1, p2, d0, d1;
          while (++i < n) {
            d1 = arc.distance(p2 = coordinates[i]);
            if (d1 < radians) {
              if (p1) clipped.push(d3_geo_greatArcInterpolate(p1, p2)((d0 - radians) / (d0 - d1)));
              clipped.push(p2);
              p0 = p1 = null;
            } else {
              p1 = p2;
              if (!p0 && clipped.length) {
                clipped.push(d3_geo_greatArcInterpolate(clipped[clipped.length - 1], p1)((radians - d0) / (d1 - d0)));
                p0 = p1;
              }
            }
            d0 = d1;
          }
          p0 = coordinates[0];
          p1 = clipped[0];
          if (p1 && p2[0] === p0[0] && p2[1] === p0[1] && !(p2[0] === p1[0] && p2[1] === p1[1])) {
            clipped.push(p1);
          }
          return resample(clipped);
        }
        function resample(coordinates) {
          var i = 0, n = coordinates.length, j, m, resampled = n ? [ coordinates[0] ] : coordinates, resamples, origin = arc.source();
          while (++i < n) {
            resamples = arc.source(coordinates[i - 1])(coordinates[i]).coordinates;
            for (j = 0, m = resamples.length; ++j < m; ) resampled.push(resamples[j]);
          }
          arc.source(origin);
          return resampled;
        }
        var origin = [ 0, 0 ], degrees = 90 - .01, radians = degrees * d3_geo_radians, arc = d3.geo.greatArc().source(origin).target(d3_identity);
        circle.clip = function(d) {
          if (typeof origin === "function") arc.source(origin.apply(this, arguments));
          return clipType(d) || null;
        };
        var clipType = d3_geo_type({
          FeatureCollection: function(o) {
            var features = o.features.map(clipType).filter(d3_identity);
            return features && (o = Object.create(o), o.features = features, o);
          },
          Feature: function(o) {
            var geometry = clipType(o.geometry);
            return geometry && (o = Object.create(o), o.geometry = geometry, o);
          },
          Point: function(o) {
            return visible(o.coordinates) && o;
          },
          MultiPoint: function(o) {
            var coordinates = o.coordinates.filter(visible);
            return coordinates.length && {
              type: o.type,
              coordinates: coordinates
            };
          },
          LineString: function(o) {
            var coordinates = clip(o.coordinates);
            return coordinates.length && (o = Object.create(o), o.coordinates = coordinates, o);
          },
          MultiLineString: function(o) {
            var coordinates = o.coordinates.map(clip).filter(function(d) {
              return d.length;
            });
            return coordinates.length && (o = Object.create(o), o.coordinates = coordinates, o);
          },
          Polygon: function(o) {
            var coordinates = o.coordinates.map(clip);
            return coordinates[0].length && (o = Object.create(o), o.coordinates = coordinates, o);
          },
          MultiPolygon: function(o) {
            var coordinates = o.coordinates.map(function(d) {
              return d.map(clip);
            }).filter(function(d) {
              return d[0].length;
            });
            return coordinates.length && (o = Object.create(o), o.coordinates = coordinates, o);
          },
          GeometryCollection: function(o) {
            var geometries = o.geometries.map(clipType).filter(d3_identity);
            return geometries.length && (o = Object.create(o), o.geometries = geometries, o);
          }
        });
        circle.origin = function(x) {
          if (!arguments.length) return origin;
          origin = x;
          if (typeof origin !== "function") arc.source(origin);
          return circle;
        };
        circle.angle = function(x) {
          if (!arguments.length) return degrees;
          radians = (degrees = +x) * d3_geo_radians;
          return circle;
        };
        return d3.rebind(circle, arc, "precision");
      };
      d3.geo.greatArc = function() {
        function greatArc() {
          var d = greatArc.distance.apply(this, arguments), t = 0, dt = precision / d, coordinates = [ p0 ];
          while ((t += dt) < 1) coordinates.push(interpolate(t));
          coordinates.push(p1);
          return {
            type: "LineString",
            coordinates: coordinates
          };
        }
        var source = d3_geo_greatArcSource, p0, target = d3_geo_greatArcTarget, p1, precision = 6 * d3_geo_radians, interpolate = d3_geo_greatArcInterpolator();
        greatArc.distance = function() {
          if (typeof source === "function") interpolate.source(p0 = source.apply(this, arguments));
          if (typeof target === "function") interpolate.target(p1 = target.apply(this, arguments));
          return interpolate.distance();
        };
        greatArc.source = function(_) {
          if (!arguments.length) return source;
          source = _;
          if (typeof source !== "function") interpolate.source(p0 = source);
          return greatArc;
        };
        greatArc.target = function(_) {
          if (!arguments.length) return target;
          target = _;
          if (typeof target !== "function") interpolate.target(p1 = target);
          return greatArc;
        };
        greatArc.precision = function(_) {
          if (!arguments.length) return precision / d3_geo_radians;
          precision = _ * d3_geo_radians;
          return greatArc;
        };
        return greatArc;
      };
      d3.geo.greatCircle = d3.geo.circle;
      d3.geom = {};
      d3.geom.contour = function(grid, start) {
        var s = start || d3_geom_contourStart(grid), c = [], x = s[0], y = s[1], dx = 0, dy = 0, pdx = NaN, pdy = NaN, i = 0;
        do {
          i = 0;
          if (grid(x - 1, y - 1)) i += 1;
          if (grid(x, y - 1)) i += 2;
          if (grid(x - 1, y)) i += 4;
          if (grid(x, y)) i += 8;
          if (i === 6) {
            dx = pdy === -1 ? -1 : 1;
            dy = 0;
          } else if (i === 9) {
            dx = 0;
            dy = pdx === 1 ? -1 : 1;
          } else {
            dx = d3_geom_contourDx[i];
            dy = d3_geom_contourDy[i];
          }
          if (dx != pdx && dy != pdy) {
            c.push([ x, y ]);
            pdx = dx;
            pdy = dy;
          }
          x += dx;
          y += dy;
        } while (s[0] != x || s[1] != y);
        return c;
      };
      var d3_geom_contourDx = [ 1, 0, 1, 1, -1, 0, -1, 1, 0, 0, 0, 0, -1, 0, -1, NaN ], d3_geom_contourDy = [ 0, -1, 0, 0, 0, -1, 0, 0, 1, -1, 1, 1, 0, -1, 0, NaN ];
      d3.geom.hull = function(vertices) {
        if (vertices.length < 3) return [];
        var len = vertices.length, plen = len - 1, points = [], stack = [], i, j, h = 0, x1, y1, x2, y2, u, v, a, sp;
        for (i = 1; i < len; ++i) {
          if (vertices[i][1] < vertices[h][1]) {
            h = i;
          } else if (vertices[i][1] == vertices[h][1]) {
            h = vertices[i][0] < vertices[h][0] ? i : h;
          }
        }
        for (i = 0; i < len; ++i) {
          if (i === h) continue;
          y1 = vertices[i][1] - vertices[h][1];
          x1 = vertices[i][0] - vertices[h][0];
          points.push({
            angle: Math.atan2(y1, x1),
            index: i
          });
        }
        points.sort(function(a, b) {
          return a.angle - b.angle;
        });
        a = points[0].angle;
        v = points[0].index;
        u = 0;
        for (i = 1; i < plen; ++i) {
          j = points[i].index;
          if (a == points[i].angle) {
            x1 = vertices[v][0] - vertices[h][0];
            y1 = vertices[v][1] - vertices[h][1];
            x2 = vertices[j][0] - vertices[h][0];
            y2 = vertices[j][1] - vertices[h][1];
            if (x1 * x1 + y1 * y1 >= x2 * x2 + y2 * y2) {
              points[i].index = -1;
            } else {
              points[u].index = -1;
              a = points[i].angle;
              u = i;
              v = j;
            }
          } else {
            a = points[i].angle;
            u = i;
            v = j;
          }
        }
        stack.push(h);
        for (i = 0, j = 0; i < 2; ++j) {
          if (points[j].index !== -1) {
            stack.push(points[j].index);
            i++;
          }
        }
        sp = stack.length;
        for (; j < plen; ++j) {
          if (points[j].index === -1) continue;
          while (!d3_geom_hullCCW(stack[sp - 2], stack[sp - 1], points[j].index, vertices)) {
            --sp;
          }
          stack[sp++] = points[j].index;
        }
        var poly = [];
        for (i = 0; i < sp; ++i) {
          poly.push(vertices[stack[i]]);
        }
        return poly;
      };
      d3.geom.polygon = function(coordinates) {
        coordinates.area = function() {
          var i = 0, n = coordinates.length, a = coordinates[n - 1][0] * coordinates[0][1], b = coordinates[n - 1][1] * coordinates[0][0];
          while (++i < n) {
            a += coordinates[i - 1][0] * coordinates[i][1];
            b += coordinates[i - 1][1] * coordinates[i][0];
          }
          return (b - a) * .5;
        };
        coordinates.centroid = function(k) {
          var i = -1, n = coordinates.length, x = 0, y = 0, a, b = coordinates[n - 1], c;
          if (!arguments.length) k = -1 / (6 * coordinates.area());
          while (++i < n) {
            a = b;
            b = coordinates[i];
            c = a[0] * b[1] - b[0] * a[1];
            x += (a[0] + b[0]) * c;
            y += (a[1] + b[1]) * c;
          }
          return [ x * k, y * k ];
        };
        coordinates.clip = function(subject) {
          var input, i = -1, n = coordinates.length, j, m, a = coordinates[n - 1], b, c, d;
          while (++i < n) {
            input = subject.slice();
            subject.length = 0;
            b = coordinates[i];
            c = input[(m = input.length) - 1];
            j = -1;
            while (++j < m) {
              d = input[j];
              if (d3_geom_polygonInside(d, a, b)) {
                if (!d3_geom_polygonInside(c, a, b)) {
                  subject.push(d3_geom_polygonIntersect(c, d, a, b));
                }
                subject.push(d);
              } else if (d3_geom_polygonInside(c, a, b)) {
                subject.push(d3_geom_polygonIntersect(c, d, a, b));
              }
              c = d;
            }
            a = b;
          }
          return subject;
        };
        return coordinates;
      };
      d3.geom.voronoi = function(vertices) {
        var polygons = vertices.map(function() {
          return [];
        });
        d3_voronoi_tessellate(vertices, function(e) {
          var s1, s2, x1, x2, y1, y2;
          if (e.a === 1 && e.b >= 0) {
            s1 = e.ep.r;
            s2 = e.ep.l;
          } else {
            s1 = e.ep.l;
            s2 = e.ep.r;
          }
          if (e.a === 1) {
            y1 = s1 ? s1.y : -1e6;
            x1 = e.c - e.b * y1;
            y2 = s2 ? s2.y : 1e6;
            x2 = e.c - e.b * y2;
          } else {
            x1 = s1 ? s1.x : -1e6;
            y1 = e.c - e.a * x1;
            x2 = s2 ? s2.x : 1e6;
            y2 = e.c - e.a * x2;
          }
          var v1 = [ x1, y1 ], v2 = [ x2, y2 ];
          polygons[e.region.l.index].push(v1, v2);
          polygons[e.region.r.index].push(v1, v2);
        });
        return polygons.map(function(polygon, i) {
          var cx = vertices[i][0], cy = vertices[i][1];
          polygon.forEach(function(v) {
            v.angle = Math.atan2(v[0] - cx, v[1] - cy);
          });
          return polygon.sort(function(a, b) {
            return a.angle - b.angle;
          }).filter(function(d, i) {
            return !i || d.angle - polygon[i - 1].angle > 1e-10;
          });
        });
      };
      var d3_voronoi_opposite = {
        l: "r",
        r: "l"
      };
      d3.geom.delaunay = function(vertices) {
        var edges = vertices.map(function() {
          return [];
        }), triangles = [];
        d3_voronoi_tessellate(vertices, function(e) {
          edges[e.region.l.index].push(vertices[e.region.r.index]);
        });
        edges.forEach(function(edge, i) {
          var v = vertices[i], cx = v[0], cy = v[1];
          edge.forEach(function(v) {
            v.angle = Math.atan2(v[0] - cx, v[1] - cy);
          });
          edge.sort(function(a, b) {
            return a.angle - b.angle;
          });
          for (var j = 0, m = edge.length - 1; j < m; j++) {
            triangles.push([ v, edge[j], edge[j + 1] ]);
          }
        });
        return triangles;
      };
      d3.geom.quadtree = function(points, x1, y1, x2, y2) {
        function insert(n, p, x1, y1, x2, y2) {
          if (isNaN(p.x) || isNaN(p.y)) return;
          if (n.leaf) {
            var v = n.point;
            if (v) {
              if (Math.abs(v.x - p.x) + Math.abs(v.y - p.y) < .01) {
                insertChild(n, p, x1, y1, x2, y2);
              } else {
                n.point = null;
                insertChild(n, v, x1, y1, x2, y2);
                insertChild(n, p, x1, y1, x2, y2);
              }
            } else {
              n.point = p;
            }
          } else {
            insertChild(n, p, x1, y1, x2, y2);
          }
        }
        function insertChild(n, p, x1, y1, x2, y2) {
          var sx = (x1 + x2) * .5, sy = (y1 + y2) * .5, right = p.x >= sx, bottom = p.y >= sy, i = (bottom << 1) + right;
          n.leaf = false;
          n = n.nodes[i] || (n.nodes[i] = d3_geom_quadtreeNode());
          if (right) x1 = sx; else x2 = sx;
          if (bottom) y1 = sy; else y2 = sy;
          insert(n, p, x1, y1, x2, y2);
        }
        var p, i = -1, n = points.length;
        if (n && isNaN(points[0].x)) points = points.map(d3_geom_quadtreePoint);
        if (arguments.length < 5) {
          if (arguments.length === 3) {
            y2 = x2 = y1;
            y1 = x1;
          } else {
            x1 = y1 = Infinity;
            x2 = y2 = -Infinity;
            while (++i < n) {
              p = points[i];
              if (p.x < x1) x1 = p.x;
              if (p.y < y1) y1 = p.y;
              if (p.x > x2) x2 = p.x;
              if (p.y > y2) y2 = p.y;
            }
            var dx = x2 - x1, dy = y2 - y1;
            if (dx > dy) y2 = y1 + dx; else x2 = x1 + dy;
          }
        }
        var root = d3_geom_quadtreeNode();
        root.add = function(p) {
          insert(root, p, x1, y1, x2, y2);
        };
        root.visit = function(f) {
          d3_geom_quadtreeVisit(f, root, x1, y1, x2, y2);
        };
        points.forEach(root.add);
        return root;
      };
      d3.time = {};
      var d3_time = Date, d3_time_daySymbols = [ "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" ];
      d3_time_utc.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() {
          d3_time_prototype.setUTCDate.apply(this._, arguments);
        },
        setDay: function() {
          d3_time_prototype.setUTCDay.apply(this._, arguments);
        },
        setFullYear: function() {
          d3_time_prototype.setUTCFullYear.apply(this._, arguments);
        },
        setHours: function() {
          d3_time_prototype.setUTCHours.apply(this._, arguments);
        },
        setMilliseconds: function() {
          d3_time_prototype.setUTCMilliseconds.apply(this._, arguments);
        },
        setMinutes: function() {
          d3_time_prototype.setUTCMinutes.apply(this._, arguments);
        },
        setMonth: function() {
          d3_time_prototype.setUTCMonth.apply(this._, arguments);
        },
        setSeconds: function() {
          d3_time_prototype.setUTCSeconds.apply(this._, arguments);
        },
        setTime: function() {
          d3_time_prototype.setTime.apply(this._, arguments);
        }
      };
      var d3_time_prototype = Date.prototype;
      var d3_time_formatDateTime = "%a %b %e %H:%M:%S %Y", d3_time_formatDate = "%m/%d/%y", d3_time_formatTime = "%H:%M:%S";
      var d3_time_days = d3_time_daySymbols, d3_time_dayAbbreviations = d3_time_days.map(d3_time_formatAbbreviate), d3_time_months = [ "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" ], d3_time_monthAbbreviations = d3_time_months.map(d3_time_formatAbbreviate);
      d3.time.format = function(template) {
        function format(date) {
          var string = [], i = -1, j = 0, c, f;
          while (++i < n) {
            if (template.charCodeAt(i) == 37) {
              string.push(template.substring(j, i), (f = d3_time_formats[c = template.charAt(++i)]) ? f(date) : c);
              j = i + 1;
            }
          }
          string.push(template.substring(j, i));
          return string.join("");
        }
        var n = template.length;
        format.parse = function(string) {
          var d = {
            y: 1900,
            m: 0,
            d: 1,
            H: 0,
            M: 0,
            S: 0,
            L: 0
          }, i = d3_time_parse(d, template, string, 0);
          if (i != string.length) return null;
          if ("p" in d) d.H = d.H % 12 + d.p * 12;
          var date = new d3_time;
          date.setFullYear(d.y, d.m, d.d);
          date.setHours(d.H, d.M, d.S, d.L);
          return date;
        };
        format.toString = function() {
          return template;
        };
        return format;
      };
      var d3_time_zfill2 = d3.format("02d"), d3_time_zfill3 = d3.format("03d"), d3_time_zfill4 = d3.format("04d"), d3_time_sfill2 = d3.format("2d");
      var d3_time_dayRe = d3_time_formatRe(d3_time_days), d3_time_dayAbbrevRe = d3_time_formatRe(d3_time_dayAbbreviations), d3_time_monthRe = d3_time_formatRe(d3_time_months), d3_time_monthLookup = d3_time_formatLookup(d3_time_months), d3_time_monthAbbrevRe = d3_time_formatRe(d3_time_monthAbbreviations), d3_time_monthAbbrevLookup = d3_time_formatLookup(d3_time_monthAbbreviations);
      var d3_time_formats = {
        a: function(d) {
          return d3_time_dayAbbreviations[d.getDay()];
        },
        A: function(d) {
          return d3_time_days[d.getDay()];
        },
        b: function(d) {
          return d3_time_monthAbbreviations[d.getMonth()];
        },
        B: function(d) {
          return d3_time_months[d.getMonth()];
        },
        c: d3.time.format(d3_time_formatDateTime),
        d: function(d) {
          return d3_time_zfill2(d.getDate());
        },
        e: function(d) {
          return d3_time_sfill2(d.getDate());
        },
        H: function(d) {
          return d3_time_zfill2(d.getHours());
        },
        I: function(d) {
          return d3_time_zfill2(d.getHours() % 12 || 12);
        },
        j: function(d) {
          return d3_time_zfill3(1 + d3.time.dayOfYear(d));
        },
        L: function(d) {
          return d3_time_zfill3(d.getMilliseconds());
        },
        m: function(d) {
          return d3_time_zfill2(d.getMonth() + 1);
        },
        M: function(d) {
          return d3_time_zfill2(d.getMinutes());
        },
        p: function(d) {
          return d.getHours() >= 12 ? "PM" : "AM";
        },
        S: function(d) {
          return d3_time_zfill2(d.getSeconds());
        },
        U: function(d) {
          return d3_time_zfill2(d3.time.sundayOfYear(d));
        },
        w: function(d) {
          return d.getDay();
        },
        W: function(d) {
          return d3_time_zfill2(d3.time.mondayOfYear(d));
        },
        x: d3.time.format(d3_time_formatDate),
        X: d3.time.format(d3_time_formatTime),
        y: function(d) {
          return d3_time_zfill2(d.getFullYear() % 100);
        },
        Y: function(d) {
          return d3_time_zfill4(d.getFullYear() % 1e4);
        },
        Z: d3_time_zone,
        "%": function(d) {
          return "%";
        }
      };
      var d3_time_parsers = {
        a: d3_time_parseWeekdayAbbrev,
        A: d3_time_parseWeekday,
        b: d3_time_parseMonthAbbrev,
        B: d3_time_parseMonth,
        c: d3_time_parseLocaleFull,
        d: d3_time_parseDay,
        e: d3_time_parseDay,
        H: d3_time_parseHour24,
        I: d3_time_parseHour24,
        L: d3_time_parseMilliseconds,
        m: d3_time_parseMonthNumber,
        M: d3_time_parseMinutes,
        p: d3_time_parseAmPm,
        S: d3_time_parseSeconds,
        x: d3_time_parseLocaleDate,
        X: d3_time_parseLocaleTime,
        y: d3_time_parseYear,
        Y: d3_time_parseFullYear
      };
      var d3_time_numberRe = /^\s*\d+/;
      var d3_time_amPmLookup = d3.map({
        am: 0,
        pm: 1
      });
      d3.time.format.utc = function(template) {
        function format(date) {
          try {
            d3_time = d3_time_utc;
            var utc = new d3_time;
            utc._ = date;
            return local(utc);
          } finally {
            d3_time = Date;
          }
        }
        var local = d3.time.format(template);
        format.parse = function(string) {
          try {
            d3_time = d3_time_utc;
            var date = local.parse(string);
            return date && date._;
          } finally {
            d3_time = Date;
          }
        };
        format.toString = local.toString;
        return format;
      };
      var d3_time_formatIso = d3.time.format.utc("%Y-%m-%dT%H:%M:%S.%LZ");
      d3.time.format.iso = Date.prototype.toISOString ? d3_time_formatIsoNative : d3_time_formatIso;
      d3_time_formatIsoNative.parse = function(string) {
        var date = new Date(string);
        return isNaN(date) ? null : date;
      };
      d3_time_formatIsoNative.toString = d3_time_formatIso.toString;
      d3.time.second = d3_time_interval(function(date) {
        return new d3_time(Math.floor(date / 1e3) * 1e3);
      }, function(date, offset) {
        date.setTime(date.getTime() + Math.floor(offset) * 1e3);
      }, function(date) {
        return date.getSeconds();
      });
      d3.time.seconds = d3.time.second.range;
      d3.time.seconds.utc = d3.time.second.utc.range;
      d3.time.minute = d3_time_interval(function(date) {
        return new d3_time(Math.floor(date / 6e4) * 6e4);
      }, function(date, offset) {
        date.setTime(date.getTime() + Math.floor(offset) * 6e4);
      }, function(date) {
        return date.getMinutes();
      });
      d3.time.minutes = d3.time.minute.range;
      d3.time.minutes.utc = d3.time.minute.utc.range;
      d3.time.hour = d3_time_interval(function(date) {
        var timezone = date.getTimezoneOffset() / 60;
        return new d3_time((Math.floor(date / 36e5 - timezone) + timezone) * 36e5);
      }, function(date, offset) {
        date.setTime(date.getTime() + Math.floor(offset) * 36e5);
      }, function(date) {
        return date.getHours();
      });
      d3.time.hours = d3.time.hour.range;
      d3.time.hours.utc = d3.time.hour.utc.range;
      d3.time.day = d3_time_interval(function(date) {
        var day = new d3_time(1970, 0);
        day.setFullYear(date.getFullYear(), date.getMonth(), date.getDate());
        return day;
      }, function(date, offset) {
        date.setDate(date.getDate() + offset);
      }, function(date) {
        return date.getDate() - 1;
      });
      d3.time.days = d3.time.day.range;
      d3.time.days.utc = d3.time.day.utc.range;
      d3.time.dayOfYear = function(date) {
        var year = d3.time.year(date);
        return Math.floor((date - year - (date.getTimezoneOffset() - year.getTimezoneOffset()) * 6e4) / 864e5);
      };
      d3_time_daySymbols.forEach(function(day, i) {
        day = day.toLowerCase();
        i = 7 - i;
        var interval = d3.time[day] = d3_time_interval(function(date) {
          (date = d3.time.day(date)).setDate(date.getDate() - (date.getDay() + i) % 7);
          return date;
        }, function(date, offset) {
          date.setDate(date.getDate() + Math.floor(offset) * 7);
        }, function(date) {
          var day = d3.time.year(date).getDay();
          return Math.floor((d3.time.dayOfYear(date) + (day + i) % 7) / 7) - (day !== i);
        });
        d3.time[day + "s"] = interval.range;
        d3.time[day + "s"].utc = interval.utc.range;
        d3.time[day + "OfYear"] = function(date) {
          var day = d3.time.year(date).getDay();
          return Math.floor((d3.time.dayOfYear(date) + (day + i) % 7) / 7);
        };
      });
      d3.time.week = d3.time.sunday;
      d3.time.weeks = d3.time.sunday.range;
      d3.time.weeks.utc = d3.time.sunday.utc.range;
      d3.time.weekOfYear = d3.time.sundayOfYear;
      d3.time.month = d3_time_interval(function(date) {
        date = d3.time.day(date);
        date.setDate(1);
        return date;
      }, function(date, offset) {
        date.setMonth(date.getMonth() + offset);
      }, function(date) {
        return date.getMonth();
      });
      d3.time.months = d3.time.month.range;
      d3.time.months.utc = d3.time.month.utc.range;
      d3.time.year = d3_time_interval(function(date) {
        date = d3.time.day(date);
        date.setMonth(0, 1);
        return date;
      }, function(date, offset) {
        date.setFullYear(date.getFullYear() + offset);
      }, function(date) {
        return date.getFullYear();
      });
      d3.time.years = d3.time.year.range;
      d3.time.years.utc = d3.time.year.utc.range;
      var d3_time_scaleSteps = [ 1e3, 5e3, 15e3, 3e4, 6e4, 3e5, 9e5, 18e5, 36e5, 108e5, 216e5, 432e5, 864e5, 1728e5, 6048e5, 2592e6, 7776e6, 31536e6 ];
      var d3_time_scaleLocalMethods = [ [ d3.time.second, 1 ], [ d3.time.second, 5 ], [ d3.time.second, 15 ], [ d3.time.second, 30 ], [ d3.time.minute, 1 ], [ d3.time.minute, 5 ], [ d3.time.minute, 15 ], [ d3.time.minute, 30 ], [ d3.time.hour, 1 ], [ d3.time.hour, 3 ], [ d3.time.hour, 6 ], [ d3.time.hour, 12 ], [ d3.time.day, 1 ], [ d3.time.day, 2 ], [ d3.time.week, 1 ], [ d3.time.month, 1 ], [ d3.time.month, 3 ], [ d3.time.year, 1 ] ];
      var d3_time_scaleLocalFormats = [ [ d3.time.format("%Y"), function(d) {
        return true;
      } ], [ d3.time.format("%B"), function(d) {
        return d.getMonth();
      } ], [ d3.time.format("%b %d"), function(d) {
        return d.getDate() != 1;
      } ], [ d3.time.format("%a %d"), function(d) {
        return d.getDay() && d.getDate() != 1;
      } ], [ d3.time.format("%I %p"), function(d) {
        return d.getHours();
      } ], [ d3.time.format("%I:%M"), function(d) {
        return d.getMinutes();
      } ], [ d3.time.format(":%S"), function(d) {
        return d.getSeconds();
      } ], [ d3.time.format(".%L"), function(d) {
        return d.getMilliseconds();
      } ] ];
      var d3_time_scaleLinear = d3.scale.linear(), d3_time_scaleLocalFormat = d3_time_scaleFormat(d3_time_scaleLocalFormats);
      d3_time_scaleLocalMethods.year = function(extent, m) {
        return d3_time_scaleLinear.domain(extent.map(d3_time_scaleGetYear)).ticks(m).map(d3_time_scaleSetYear);
      };
      d3.time.scale = function() {
        return d3_time_scale(d3.scale.linear(), d3_time_scaleLocalMethods, d3_time_scaleLocalFormat);
      };
      var d3_time_scaleUTCMethods = d3_time_scaleLocalMethods.map(function(m) {
        return [ m[0].utc, m[1] ];
      });
      var d3_time_scaleUTCFormats = [ [ d3.time.format.utc("%Y"), function(d) {
        return true;
      } ], [ d3.time.format.utc("%B"), function(d) {
        return d.getUTCMonth();
      } ], [ d3.time.format.utc("%b %d"), function(d) {
        return d.getUTCDate() != 1;
      } ], [ d3.time.format.utc("%a %d"), function(d) {
        return d.getUTCDay() && d.getUTCDate() != 1;
      } ], [ d3.time.format.utc("%I %p"), function(d) {
        return d.getUTCHours();
      } ], [ d3.time.format.utc("%I:%M"), function(d) {
        return d.getUTCMinutes();
      } ], [ d3.time.format.utc(":%S"), function(d) {
        return d.getUTCSeconds();
      } ], [ d3.time.format.utc(".%L"), function(d) {
        return d.getUTCMilliseconds();
      } ] ];
      var d3_time_scaleUTCFormat = d3_time_scaleFormat(d3_time_scaleUTCFormats);
      d3_time_scaleUTCMethods.year = function(extent, m) {
        return d3_time_scaleLinear.domain(extent.map(d3_time_scaleUTCGetYear)).ticks(m).map(d3_time_scaleUTCSetYear);
      };
      d3.time.scale.utc = function() {
        return d3_time_scale(d3.scale.linear(), d3_time_scaleUTCMethods, d3_time_scaleUTCFormat);
      };
    })();����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������rickshaw-1.4.6/vendor/d3.v3.js����������������������������������������������������������������������0000664�0000000�0000000�00000432516�12251233401�0016031�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������d3=function(){function n(n){return null!=n&&!isNaN(n)}function t(n){return n.length}function e(n){for(var t=1;n*t%1;)t*=10;return t}function r(n,t){try{for(var e in t)Object.defineProperty(n.prototype,e,{value:t[e],enumerable:!1})}catch(r){n.prototype=t}}function u(){}function i(){}function o(n,t,e){return function(){var r=e.apply(t,arguments);return r===t?n:r}}function a(n,t){if(t in n)return t;t=t.charAt(0).toUpperCase()+t.substring(1);for(var e=0,r=Do.length;r>e;++e){var u=Do[e]+t;if(u in n)return u}}function c(){}function l(){}function s(n){function t(){for(var t,r=e,u=-1,i=r.length;++u<i;)(t=r[u].on)&&t.apply(this,arguments);return n}var e=[],r=new u;return t.on=function(t,u){var i,o=r.get(t);return arguments.length<2?o&&o.on:(o&&(o.on=null,e=e.slice(0,i=e.indexOf(o)).concat(e.slice(i+1)),r.remove(t)),u&&e.push(r.set(t,{on:u})),n)},t}function f(){mo.event.preventDefault()}function h(){for(var n,t=mo.event;n=t.sourceEvent;)t=n;return t}function g(n){for(var t=new l,e=0,r=arguments.length;++e<r;)t[arguments[e]]=s(t);return t.of=function(e,r){return function(u){try{var i=u.sourceEvent=mo.event;u.target=n,mo.event=u,t[u.type].apply(e,r)}finally{mo.event=i}}},t}function p(n){return Lo(n,Ro),n}function d(n){return"function"==typeof n?n:function(){return Ho(n,this)}}function v(n){return"function"==typeof n?n:function(){return Fo(n,this)}}function m(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=mo.ns.qualify(n),null==t?n.local?r:e:"function"==typeof t?n.local?a:o:n.local?i:u}function y(n){return n.trim().replace(/\s+/g," ")}function M(n){return new RegExp("(?:^|\\s+)"+mo.requote(n)+"(?:\\s+|$)","g")}function x(n,t){function e(){for(var e=-1;++e<u;)n[e](this,t)}function r(){for(var e=-1,r=t.apply(this,arguments);++e<u;)n[e](this,r)}n=n.trim().split(/\s+/).map(b);var u=n.length;return"function"==typeof t?r:e}function b(n){var t=M(n);return function(e,r){if(u=e.classList)return r?u.add(n):u.remove(n);var u=e.getAttribute("class")||"";r?(t.lastIndex=0,t.test(u)||e.setAttribute("class",y(u+" "+n))):e.setAttribute("class",y(u.replace(t," ")))}}function _(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:"function"==typeof t?i:u}function w(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:"function"==typeof t?u:r}function S(n){return"function"==typeof n?n:(n=mo.ns.qualify(n)).local?function(){return xo.createElementNS(n.space,n.local)}:function(){return xo.createElementNS(this.namespaceURI,n)}}function E(n){return{__data__:n}}function k(n){return function(){return Oo(this,n)}}function A(n){return arguments.length||(n=mo.ascending),function(t,e){return t&&e?n(t.__data__,e.__data__):!t-!e}}function N(n,t){for(var e=0,r=n.length;r>e;e++)for(var u,i=n[e],o=0,a=i.length;a>o;o++)(u=i[o])&&t(u,o,e);return n}function T(n){return Lo(n,Io),n}function q(n){var t,e;return function(r,u,i){var o,a=n[i].update,c=a.length;for(i!=e&&(e=i,t=0),u>=t&&(t=u+1);!(o=a[t])&&++t<c;);return o}}function z(){var n=this.__transition__;n&&++n.active}function C(n,t,e){function r(){var t=this[o];t&&(this.removeEventListener(n,t,t.$),delete this[o])}function u(){var u=l(t,Mo(arguments));r.call(this),this.addEventListener(n,this[o]=u,u.$=e),u._=t}function i(){var t,e=new RegExp("^__on([^.]+)"+mo.requote(n)+"$");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="__on"+n,a=n.indexOf("."),l=D;a>0&&(n=n.substring(0,a));var s=Zo.get(n);return s&&(n=s,l=j),a?t?u:r:t?c:i}function D(n,t){return function(e){var r=mo.event;mo.event=e,t[0]=this.__data__;try{n.apply(this,t)}finally{mo.event=r}}}function j(n,t){var e=D(n,t);return function(n){var t=this,r=n.relatedTarget;r&&(r===t||8&r.compareDocumentPosition(t))||e.call(t,n)}}function L(){var n=".dragsuppress-"+ ++Xo,t="touchmove"+n,e="selectstart"+n,r="dragstart"+n,u="click"+n,i=mo.select(_o).on(t,f).on(e,f).on(r,f),o=bo.style,a=o[Vo];return o[Vo]="none",function(t){function e(){i.on(u,null)}i.on(n,null),o[Vo]=a,t&&(i.on(u,function(){f(),e()},!0),setTimeout(e,0))}}function H(n,t){t.changedTouches&&(t=t.changedTouches[0]);var e=n.ownerSVGElement||n;if(e.createSVGPoint){var r=e.createSVGPoint();if(0>$o&&(_o.scrollX||_o.scrollY)){e=mo.select("body").append("svg").style({position:"absolute",top:0,left:0,margin:0,padding:0,border:"none"},"important");var u=e[0][0].getScreenCTM();$o=!(u.f||u.e),e.remove()}return $o?(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 F(n){return n>0?1:0>n?-1:0}function P(n){return n>1?0:-1>n?Bo:Math.acos(n)}function O(n){return n>1?Jo:-1>n?-Jo:Math.asin(n)}function R(n){return((n=Math.exp(n))-1/n)/2}function Y(n){return((n=Math.exp(n))+1/n)/2}function I(n){return((n=Math.exp(2*n))-1)/(n+1)}function U(n){return(n=Math.sin(n/2))*n}function Z(){}function V(n,t,e){return new X(n,t,e)}function X(n,t,e){this.h=n,this.s=t,this.l=e}function $(n,t,e){function r(n){return n>360?n-=360:0>n&&(n+=360),60>n?i+(o-i)*n/60:180>n?o:240>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)<0?n+360:n,t=isNaN(t)?0:0>t?0:t>1?1:t,e=0>e?0:e>1?1:e,o=.5>=e?e*(1+t):e+t-e*t,i=2*e-o,ot(u(n+120),u(n),u(n-120))}function B(n,t,e){return new W(n,t,e)}function W(n,t,e){this.h=n,this.c=t,this.l=e}function J(n,t,e){return isNaN(n)&&(n=0),isNaN(t)&&(t=0),G(e,Math.cos(n*=Qo)*t,Math.sin(n)*t)}function G(n,t,e){return new K(n,t,e)}function K(n,t,e){this.l=n,this.a=t,this.b=e}function Q(n,t,e){var r=(n+16)/116,u=r+t/500,i=r-e/200;return u=tt(u)*sa,r=tt(r)*fa,i=tt(i)*ha,ot(rt(3.2404542*u-1.5371385*r-.4985314*i),rt(-.969266*u+1.8760108*r+.041556*i),rt(.0556434*u-.2040259*r+1.0572252*i))}function nt(n,t,e){return n>0?B(Math.atan2(e,t)*na,Math.sqrt(t*t+e*e),n):B(0/0,0/0,n)}function tt(n){return n>.206893034?n*n*n:(n-4/29)/7.787037}function et(n){return n>.008856?Math.pow(n,1/3):7.787037*n+4/29}function rt(n){return Math.round(255*(.00304>=n?12.92*n:1.055*Math.pow(n,1/2.4)-.055))}function ut(n){return ot(n>>16,255&n>>8,255&n)}function it(n){return ut(n)+""}function ot(n,t,e){return new at(n,t,e)}function at(n,t,e){this.r=n,this.g=t,this.b=e}function ct(n){return 16>n?"0"+Math.max(0,n).toString(16):Math.min(255,n).toString(16)}function lt(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(","),r[1]){case"hsl":return e(parseFloat(u[0]),parseFloat(u[1])/100,parseFloat(u[2])/100);case"rgb":return t(gt(u[0]),gt(u[1]),gt(u[2]))}return(i=da.get(n))?t(i.r,i.g,i.b):(null!=n&&"#"===n.charAt(0)&&(4===n.length?(o=n.charAt(1),o+=o,a=n.charAt(2),a+=a,c=n.charAt(3),c+=c):7===n.length&&(o=n.substring(1,3),a=n.substring(3,5),c=n.substring(5,7)),o=parseInt(o,16),a=parseInt(a,16),c=parseInt(c,16)),t(o,a,c))}function st(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>c?a/(o+i):a/(2-o-i),r=n==o?(t-e)/a+(e>t?6:0):t==o?(e-n)/a+2:(n-t)/a+4,r*=60):(r=0/0,u=c>0&&1>c?0:r),V(r,u,c)}function ft(n,t,e){n=ht(n),t=ht(t),e=ht(e);var r=et((.4124564*n+.3575761*t+.1804375*e)/sa),u=et((.2126729*n+.7151522*t+.072175*e)/fa),i=et((.0193339*n+.119192*t+.9503041*e)/ha);return G(116*u-16,500*(r-u),200*(u-i))}function ht(n){return(n/=255)<=.04045?n/12.92:Math.pow((n+.055)/1.055,2.4)}function gt(n){var t=parseFloat(n);return"%"===n.charAt(n.length-1)?Math.round(2.55*t):t}function pt(n){return"function"==typeof n?n:function(){return n}}function dt(n){return n}function vt(n){return function(t,e,r){return 2===arguments.length&&"function"==typeof e&&(r=e,e=null),mt(t,e,n,r)}}function mt(n,t,e,r){function u(){var n,t=c.status;if(!t&&c.responseText||t>=200&&300>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=mo.dispatch("beforesend","progress","load","error"),a={},c=new XMLHttpRequest,l=null;return!_o.XDomainRequest||"withCredentials"in c||!/^(http(s)?:)?\/\//.test(n)||(c=new XDomainRequest),"onload"in c?c.onload=c.onerror=u:c.onreadystatechange=function(){c.readyState>3&&u()},c.onprogress=function(n){var t=mo.event;mo.event=n;try{o.progress.call(i,c)}finally{mo.event=t}},i.header=function(n,t){return n=(n+"").toLowerCase(),arguments.length<2?a[n]:(null==t?delete a[n]:a[n]=t+"",i)},i.mimeType=function(n){return arguments.length?(t=null==n?null:n+"",i):t},i.responseType=function(n){return arguments.length?(l=n,i):l},i.response=function(n){return e=n,i},["get","post"].forEach(function(n){i[n]=function(){return i.send.apply(i,[n].concat(Mo(arguments)))}}),i.send=function(e,r,u){if(2===arguments.length&&"function"==typeof r&&(u=r,r=null),c.open(e,n,!0),null==t||"accept"in a||(a.accept=t+",*/*"),c.setRequestHeader)for(var s in a)c.setRequestHeader(s,a[s]);return null!=t&&c.overrideMimeType&&c.overrideMimeType(t),null!=l&&(c.responseType=l),null!=u&&i.on("error",u).on("load",function(n){u(null,n)}),o.beforesend.call(i,c),c.send(null==r?null:r),i},i.abort=function(){return c.abort(),i},mo.rebind(i,o,"on"),null==r?i:i.get(yt(r))}function yt(n){return 1===n.length?function(t,e){n(null==t?e:null)}:n}function Mt(){var n=bt(),t=_t()-n;t>24?(isFinite(t)&&(clearTimeout(Ma),Ma=setTimeout(Mt,t)),ya=0):(ya=1,ba(Mt))}function xt(n,t,e){var r=arguments.length;2>r&&(t=0),3>r&&(e=Date.now()),xa.callback=n,xa.time=e+t}function bt(){var n=Date.now();for(xa=va;xa;)n>=xa.time&&(xa.flush=xa.callback(n-xa.time)),xa=xa.next;return n}function _t(){for(var n,t=va,e=1/0;t;)t.flush?t=n?n.next=t.next:va=t.next:(t.time<e&&(e=t.time),t=(n=t).next);return ma=n,e}function wt(n,t){var e=Math.pow(10,3*Math.abs(8-t));return{scale:t>8?function(n){return n/e}:function(n){return n*e},symbol:n}}function St(n,t){return t-(n?Math.ceil(Math.log(n)/Math.LN10):1)}function Et(n){return n+""}function kt(){}function At(n,t,e){var r=e.s=n+t,u=r-n,i=r-u;e.t=n-i+(t-u)}function Nt(n,t){n&&Da.hasOwnProperty(n.type)&&Da[n.type](n,t)}function Tt(n,t,e){var r,u=-1,i=n.length-e;for(t.lineStart();++u<i;)r=n[u],t.point(r[0],r[1],r[2]);t.lineEnd()}function qt(n,t){var e=-1,r=n.length;for(t.polygonStart();++e<r;)Tt(n[e],t,1);t.polygonEnd()}function zt(){function n(n,t){n*=Qo,t=t*Qo/2+Bo/4;var e=n-r,o=Math.cos(t),a=Math.sin(t),c=i*a,l=u*o+c*Math.cos(e),s=c*Math.sin(e);La.add(Math.atan2(s,l)),r=n,u=o,i=a}var t,e,r,u,i;Ha.point=function(o,a){Ha.point=n,r=(t=o)*Qo,u=Math.cos(a=(e=a)*Qo/2+Bo/4),i=Math.sin(a)},Ha.lineEnd=function(){n(t,e)}}function Ct(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 Dt(n,t){return n[0]*t[0]+n[1]*t[1]+n[2]*t[2]}function jt(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 Lt(n,t){n[0]+=t[0],n[1]+=t[1],n[2]+=t[2]}function Ht(n,t){return[n[0]*t,n[1]*t,n[2]*t]}function Ft(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 Pt(n){return[Math.atan2(n[1],n[0]),O(n[2])]}function Ot(n,t){return Math.abs(n[0]-t[0])<Go&&Math.abs(n[1]-t[1])<Go}function Rt(n,t){n*=Qo;var e=Math.cos(t*=Qo);Yt(e*Math.cos(n),e*Math.sin(n),Math.sin(t))}function Yt(n,t,e){++Fa,Oa+=(n-Oa)/Fa,Ra+=(t-Ra)/Fa,Ya+=(e-Ya)/Fa}function It(){function n(n,u){n*=Qo;var i=Math.cos(u*=Qo),o=i*Math.cos(n),a=i*Math.sin(n),c=Math.sin(u),l=Math.atan2(Math.sqrt((l=e*c-r*a)*l+(l=r*o-t*c)*l+(l=t*a-e*o)*l),t*o+e*a+r*c);Pa+=l,Ia+=l*(t+(t=o)),Ua+=l*(e+(e=a)),Za+=l*(r+(r=c)),Yt(t,e,r)}var t,e,r;Ba.point=function(u,i){u*=Qo;var o=Math.cos(i*=Qo);t=o*Math.cos(u),e=o*Math.sin(u),r=Math.sin(i),Ba.point=n,Yt(t,e,r)}}function Ut(){Ba.point=Rt}function Zt(){function n(n,t){n*=Qo;var e=Math.cos(t*=Qo),o=e*Math.cos(n),a=e*Math.sin(n),c=Math.sin(t),l=u*c-i*a,s=i*o-r*c,f=r*a-u*o,h=Math.sqrt(l*l+s*s+f*f),g=r*o+u*a+i*c,p=h&&-P(g)/h,d=Math.atan2(h,g);Va+=p*l,Xa+=p*s,$a+=p*f,Pa+=d,Ia+=d*(r+(r=o)),Ua+=d*(u+(u=a)),Za+=d*(i+(i=c)),Yt(r,u,i)}var t,e,r,u,i;Ba.point=function(o,a){t=o,e=a,Ba.point=n,o*=Qo;var c=Math.cos(a*=Qo);r=c*Math.cos(o),u=c*Math.sin(o),i=Math.sin(a),Yt(r,u,i)},Ba.lineEnd=function(){n(t,e),Ba.lineEnd=Ut,Ba.point=Rt}}function Vt(){return!0}function Xt(n,t,e,r,u){var i=[],o=[];if(n.forEach(function(n){if(!((t=n.length-1)<=0)){var t,e=n[0],r=n[t];if(Ot(e,r)){u.lineStart();for(var a=0;t>a;++a)u.point((e=n[a])[0],e[1]);return u.lineEnd(),void 0}var c={point:e,points:n,other:null,visited:!1,entry:!0,subject:!0},l={point:e,points:[e],other:c,visited:!1,entry:!1,subject:!1};c.other=l,i.push(c),o.push(l),c={point:r,points:[r],other:null,visited:!1,entry:!1,subject:!0},l={point:r,points:[r],other:c,visited:!1,entry:!0,subject:!1},c.other=l,i.push(c),o.push(l)}}),o.sort(t),$t(i),$t(o),i.length){for(var a=0,c=e,l=o.length;l>a;++a)o[a].entry=c=!c;for(var s,f,h,g=i[0];;){for(s=g;s.visited;)if((s=s.next)===g)return;f=s.points,u.lineStart();do{if(s.visited=s.other.visited=!0,s.entry){if(s.subject)for(var a=0;a<f.length;a++)u.point((h=f[a])[0],h[1]);else r(s.point,s.next.point,1,u);s=s.next}else{if(s.subject){f=s.prev.points;for(var a=f.length;--a>=0;)u.point((h=f[a])[0],h[1])}else r(s.point,s.prev.point,-1,u);s=s.prev}s=s.other,f=s.points}while(!s.visited);u.lineEnd()}}}function $t(n){if(t=n.length){for(var t,e,r=0,u=n[0];++r<t;)u.next=e=n[r],e.prev=u,u=e;u.next=e=n[0],e.prev=u}}function Bt(n,t,e,r){return function(u,i){function o(t,e){var r=u(t,e);n(t=r[0],e=r[1])&&i.point(t,e)}function a(n,t){var e=u(n,t);v.point(e[0],e[1])}function c(){y.point=a,v.lineStart()}function l(){y.point=o,v.lineEnd()}function s(n,t){d.push([n,t]);var e=u(n,t);x.point(e[0],e[1])}function f(){x.lineStart(),d=[]}function h(){s(d[0][0],d[0][1]),x.lineEnd();var n,t=x.clean(),e=M.buffer(),r=e.length;if(d.pop(),p.push(d),d=null,r){if(1&t){n=e[0];var u,r=n.length-1,o=-1;for(i.lineStart();++o<r;)i.point((u=n[o])[0],u[1]);return i.lineEnd(),void 0}r>1&&2&t&&e.push(e.pop().concat(e.shift())),g.push(e.filter(Wt))}}var g,p,d,v=t(i),m=u.invert(r[0],r[1]),y={point:o,lineStart:c,lineEnd:l,polygonStart:function(){y.point=s,y.lineStart=f,y.lineEnd=h,g=[],p=[],i.polygonStart()},polygonEnd:function(){y.point=o,y.lineStart=c,y.lineEnd=l,g=mo.merge(g);var n=Kt(m,p);g.length?Xt(g,Gt,n,e,i):n&&(i.lineStart(),e(null,null,1,i),i.lineEnd()),i.polygonEnd(),g=p=null},sphere:function(){i.polygonStart(),i.lineStart(),e(null,null,1,i),i.lineEnd(),i.polygonEnd()}},M=Jt(),x=t(M);return y}}function Wt(n){return n.length>1}function Jt(){var n,t=[];return{lineStart:function(){t.push(n=[])},point:function(t,e){n.push([t,e])},lineEnd:c,buffer:function(){var e=t;return t=[],n=null,e},rejoin:function(){t.length>1&&t.push(t.pop().concat(t.shift()))}}}function Gt(n,t){return((n=n.point)[0]<0?n[1]-Jo-Go:Jo-n[1])-((t=t.point)[0]<0?t[1]-Jo-Go:Jo-t[1])}function Kt(n,t){var e=n[0],r=n[1],u=[Math.sin(e),-Math.cos(e),0],i=0,o=0;La.reset();for(var a=0,c=t.length;c>a;++a){var l=t[a],s=l.length;if(s)for(var f=l[0],h=f[0],g=f[1]/2+Bo/4,p=Math.sin(g),d=Math.cos(g),v=1;;){v===s&&(v=0),n=l[v];var m=n[0],y=n[1]/2+Bo/4,M=Math.sin(y),x=Math.cos(y),b=m-h,_=Math.abs(b)>Bo,w=p*M;if(La.add(Math.atan2(w*Math.sin(b),d*x+w*Math.cos(b))),i+=_?b+(b>=0?2:-2)*Bo:b,_^h>=e^m>=e){var S=jt(Ct(f),Ct(n));Ft(S);var E=jt(u,S);Ft(E);var k=(_^b>=0?-1:1)*O(E[2]);(r>k||r===k&&(S[0]||S[1]))&&(o+=_^b>=0?1:-1)}if(!v++)break;h=m,p=M,d=x,f=n}}return(-Go>i||Go>i&&0>La)^1&o}function Qt(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>0?Bo:-Bo,c=Math.abs(i-e);Math.abs(c-Bo)<Go?(n.point(e,r=(r+o)/2>0?Jo:-Jo),n.point(u,r),n.lineEnd(),n.lineStart(),n.point(a,r),n.point(i,r),t=0):u!==a&&c>=Bo&&(Math.abs(e-u)<Go&&(e-=u*Go),Math.abs(i-a)<Go&&(i-=a*Go),r=ne(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 ne(n,t,e,r){var u,i,o=Math.sin(n-e);return Math.abs(o)>Go?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 te(n,t,e,r){var u;if(null==n)u=e*Jo,r.point(-Bo,u),r.point(0,u),r.point(Bo,u),r.point(Bo,0),r.point(Bo,-u),r.point(0,-u),r.point(-Bo,-u),r.point(-Bo,0),r.point(-Bo,u);else if(Math.abs(n[0]-t[0])>Go){var i=(n[0]<t[0]?1:-1)*Bo;u=e*i/2,r.point(-i,u),r.point(0,u),r.point(i,u)}else r.point(t[0],t[1])}function ee(n){function t(n,t){return Math.cos(n)*Math.cos(t)>i}function e(n){var e,i,c,l,s;return{lineStart:function(){l=c=!1,s=1},point:function(f,h){var g,p=[f,h],d=t(f,h),v=o?d?0:u(f,h):d?u(f+(0>f?Bo:-Bo),h):0;if(!e&&(l=c=d)&&n.lineStart(),d!==c&&(g=r(e,p),(Ot(e,g)||Ot(p,g))&&(p[0]+=Go,p[1]+=Go,d=t(p[0],p[1]))),d!==c)s=0,d?(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&&e&&o^d){var m;v&i||!(m=r(p,e,!0))||(s=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])))}!d||e&&Ot(e,p)||n.point(p[0],p[1]),e=p,c=d,i=v},lineEnd:function(){c&&n.lineEnd(),e=null},clean:function(){return s|(l&&c)<<1}}}function r(n,t,e){var r=Ct(n),u=Ct(t),o=[1,0,0],a=jt(r,u),c=Dt(a,a),l=a[0],s=c-l*l;if(!s)return!e&&n;var f=i*c/s,h=-i*l/s,g=jt(o,a),p=Ht(o,f),d=Ht(a,h);Lt(p,d);var v=g,m=Dt(p,v),y=Dt(v,v),M=m*m-y*(Dt(p,p)-1);if(!(0>M)){var x=Math.sqrt(M),b=Ht(v,(-m-x)/y);if(Lt(b,p),b=Pt(b),!e)return b;var _,w=n[0],S=t[0],E=n[1],k=t[1];w>S&&(_=w,w=S,S=_);var A=S-w,N=Math.abs(A-Bo)<Go,T=N||Go>A;if(!N&&E>k&&(_=E,E=k,k=_),T?N?E+k>0^b[1]<(Math.abs(b[0]-w)<Go?E:k):E<=b[1]&&b[1]<=k:A>Bo^(w<=b[0]&&b[0]<=S)){var q=Ht(v,(-m+x)/y);return Lt(q,p),[b,Pt(q)]}}}function u(t,e){var r=o?n:Bo-n,u=0;return-r>t?u|=1:t>r&&(u|=2),-r>e?u|=4:e>r&&(u|=8),u}var i=Math.cos(n),o=i>0,a=Math.abs(i)>Go,c=Te(n,6*Qo);return Bt(t,e,c,o?[0,-n]:[-Bo,n-Bo])}function re(n,t,e,r){function u(r,u){return Math.abs(r[0]-n)<Go?u>0?0:3:Math.abs(r[0]-e)<Go?u>0?2:1:Math.abs(r[1]-t)<Go?u>0?1:0:u>0?3:2}function i(n,t){return o(n.point,t.point)}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]}function a(u,i){var o=i[0]-u[0],a=i[1]-u[1],c=[0,1];return Math.abs(o)<Go&&Math.abs(a)<Go?n<=u[0]&&u[0]<=e&&t<=u[1]&&u[1]<=r:ue(n-u[0],o,c)&&ue(u[0]-e,-o,c)&&ue(t-u[1],a,c)&&ue(u[1]-r,-a,c)?(c[1]<1&&(i[0]=u[0]+c[1]*o,i[1]=u[1]+c[1]*a),c[0]>0&&(u[0]+=c[0]*o,u[1]+=c[0]*a),!0):!1}return function(c){function l(n){for(var t=0,e=y.length,r=n[1],u=0;e>u;++u)for(var i,o=1,a=y[u],c=a.length,l=a[0];c>o;++o)i=a[o],l[1]<=r?i[1]>r&&s(l,i,n)>0&&++t:i[1]<=r&&s(l,i,n)<0&&--t,l=i;return 0!==t}function s(n,t,e){return(t[0]-n[0])*(e[1]-n[1])-(e[0]-n[0])*(t[1]-n[1])}function f(i,a,c,l){var s=0,f=0;if(null==i||(s=u(i,c))!==(f=u(a,c))||o(i,a)<0^c>0){do l.point(0===s||3===s?n:e,s>1?r:t);while((s=(s+c+4)%4)!==f)}else l.point(a[0],a[1])}function h(u,i){return u>=n&&e>=u&&i>=t&&r>=i}function g(n,t){h(n,t)&&c.point(n,t)}function p(){q.point=v,y&&y.push(M=[]),k=!0,E=!1,w=S=0/0}function d(){m&&(v(x,b),_&&E&&T.rejoin(),m.push(T.buffer())),q.point=g,E&&c.lineEnd()}function v(n,t){n=Math.max(-Ja,Math.min(Ja,n)),t=Math.max(-Ja,Math.min(Ja,t));var e=h(n,t);if(y&&M.push([n,t]),k)x=n,b=t,_=e,k=!1,e&&(c.lineStart(),c.point(n,t));else if(e&&E)c.point(n,t);else{var r=[w,S],u=[n,t];a(r,u)?(E||(c.lineStart(),c.point(r[0],r[1])),c.point(u[0],u[1]),e||c.lineEnd(),A=!1):e&&(c.lineStart(),c.point(n,t),A=!1)}w=n,S=t,E=e}var m,y,M,x,b,_,w,S,E,k,A,N=c,T=Jt(),q={point:g,lineStart:p,lineEnd:d,polygonStart:function(){c=T,m=[],y=[],A=!0},polygonEnd:function(){c=N,m=mo.merge(m);var t=l([n,r]),e=A&&t,u=m.length;(e||u)&&(c.polygonStart(),e&&(c.lineStart(),f(null,null,1,c),c.lineEnd()),u&&Xt(m,i,t,f,c),c.polygonEnd()),m=y=M=null}};return q}}function ue(n,t,e){if(Math.abs(t)<Go)return 0>=n;var r=n/t;if(t>0){if(r>e[1])return!1;r>e[0]&&(e[0]=r)}else{if(r<e[0])return!1;r<e[1]&&(e[1]=r)}return!0}function ie(n,t){function e(e,r){return e=n(e,r),t(e[0],e[1])}return n.invert&&t.invert&&(e.invert=function(e,r){return e=t.invert(e,r),e&&n.invert(e[0],e[1])}),e}function oe(n){var t=0,e=Bo/3,r=be(n),u=r(t,e);return u.parallels=function(n){return arguments.length?r(t=n[0]*Bo/180,e=n[1]*Bo/180):[180*(t/Bo),180*(e/Bo)]},u}function ae(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,O((i-(n*n+e*e)*u*u)/(2*u))]},e}function ce(){function n(n,t){Ka+=u*n-r*t,r=n,u=t}var t,e,r,u;rc.point=function(i,o){rc.point=n,t=r=i,e=u=o},rc.lineEnd=function(){n(t,e)}}function le(n,t){Qa>n&&(Qa=n),n>tc&&(tc=n),nc>t&&(nc=t),t>ec&&(ec=t)}function se(){function n(n,t){o.push("M",n,",",t,i)}function t(n,t){o.push("M",n,",",t),a.point=e}function e(n,t){o.push("L",n,",",t)}function r(){a.point=n}function u(){o.push("Z")}var i=fe(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=fe(n),a},result:function(){if(o.length){var n=o.join("");return o=[],n}}};return a}function fe(n){return"m0,"+n+"a"+n+","+n+" 0 1,1 0,"+-2*n+"a"+n+","+n+" 0 1,1 0,"+2*n+"z"}function he(n,t){Oa+=n,Ra+=t,++Ya}function ge(){function n(n,r){var u=n-t,i=r-e,o=Math.sqrt(u*u+i*i);Ia+=o*(t+n)/2,Ua+=o*(e+r)/2,Za+=o,he(t=n,e=r)}var t,e;ic.point=function(r,u){ic.point=n,he(t=r,e=u)}}function pe(){ic.point=he}function de(){function n(n,t){var e=n-r,i=t-u,o=Math.sqrt(e*e+i*i);Ia+=o*(r+n)/2,Ua+=o*(u+t)/2,Za+=o,o=u*n-r*t,Va+=o*(r+n),Xa+=o*(u+t),$a+=3*o,he(r=n,u=t)}var t,e,r,u;ic.point=function(i,o){ic.point=n,he(t=r=i,e=u=o)},ic.lineEnd=function(){n(t,e)}}function ve(n){function t(t,e){n.moveTo(t,e),n.arc(t,e,o,0,Wo)}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:c};return a}function me(n){function t(t){function r(e,r){e=n(e,r),t.point(e[0],e[1])}function u(){M=0/0,S.point=o,t.lineStart()}function o(r,u){var o=Ct([r,u]),a=n(r,u);e(M,x,y,b,_,w,M=a[0],x=a[1],y=r,b=o[0],_=o[1],w=o[2],i,t),t.point(M,x)}function a(){S.point=r,t.lineEnd()}function c(){u(),S.point=l,S.lineEnd=s}function l(n,t){o(f=n,h=t),g=M,p=x,d=b,v=_,m=w,S.point=o}function s(){e(M,x,y,b,_,w,g,p,f,d,v,m,i,t),S.lineEnd=a,a()}var f,h,g,p,d,v,m,y,M,x,b,_,w,S={point:r,lineStart:u,lineEnd:a,polygonStart:function(){t.polygonStart(),S.lineStart=c},polygonEnd:function(){t.polygonEnd(),S.lineStart=u}};return S}function e(t,i,o,a,c,l,s,f,h,g,p,d,v,m){var y=s-t,M=f-i,x=y*y+M*M;if(x>4*r&&v--){var b=a+g,_=c+p,w=l+d,S=Math.sqrt(b*b+_*_+w*w),E=Math.asin(w/=S),k=Math.abs(Math.abs(w)-1)<Go?(o+h)/2:Math.atan2(_,b),A=n(k,E),N=A[0],T=A[1],q=N-t,z=T-i,C=M*q-y*z;(C*C/x>r||Math.abs((y*q+M*z)/x-.5)>.3||u>a*g+c*p+l*d)&&(e(t,i,o,a,c,l,N,T,k,b/=S,_/=S,w,v,m),m.point(N,T),e(N,T,k,b,_,w,s,f,h,g,p,d,v,m))}}var r=.5,u=Math.cos(30*Qo),i=16;return t.precision=function(n){return arguments.length?(i=(r=n*n)>0&&16,t):Math.sqrt(r)},t}function ye(n){this.stream=n}function Me(n){var t=me(function(t,e){return n([t*na,e*na])});return function(n){var e=new ye(n=t(n));return e.point=function(t,e){n.point(t*Qo,e*Qo)},e}}function xe(n){return be(function(){return n})()}function be(n){function t(n){return n=a(n[0]*Qo,n[1]*Qo),[n[0]*h+c,l-n[1]*h]}function e(n){return n=a.invert((n[0]-c)/h,(l-n[1])/h),n&&[n[0]*na,n[1]*na]}function r(){a=ie(o=Ee(m,y,M),i);var n=i(d,v);return c=g-n[0]*h,l=p+n[1]*h,u()}function u(){return s&&(s.valid=!1,s=null),t}var i,o,a,c,l,s,f=me(function(n,t){return n=i(n,t),[n[0]*h+c,l-n[1]*h]}),h=150,g=480,p=250,d=0,v=0,m=0,y=0,M=0,x=Wa,b=dt,_=null,w=null;return t.stream=function(n){return s&&(s.valid=!1),s=_e(x(o,f(b(n)))),s.valid=!0,s},t.clipAngle=function(n){return arguments.length?(x=null==n?(_=n,Wa):ee((_=+n)*Qo),u()):_},t.clipExtent=function(n){return arguments.length?(w=n,b=n?re(n[0][0],n[0][1],n[1][0],n[1][1]):dt,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?(d=n[0]%360*Qo,v=n[1]%360*Qo,r()):[d*na,v*na]},t.rotate=function(n){return arguments.length?(m=n[0]%360*Qo,y=n[1]%360*Qo,M=n.length>2?n[2]%360*Qo:0,r()):[m*na,y*na,M*na]},mo.rebind(t,f,"precision"),function(){return i=n.apply(this,arguments),t.invert=i.invert&&e,r()}}function _e(n){var t=new ye(n);return t.point=function(t,e){n.point(t*Qo,e*Qo)},t}function we(n,t){return[n,t]}function Se(n,t){return[n>Bo?n-Wo:-Bo>n?n+Wo:n,t]}function Ee(n,t,e){return n?t||e?ie(Ae(n),Ne(t,e)):Ae(n):t||e?Ne(t,e):Se}function ke(n){return function(t,e){return t+=n,[t>Bo?t-Wo:-Bo>t?t+Wo:t,e]}}function Ae(n){var t=ke(n);return t.invert=ke(-n),t}function Ne(n,t){function e(n,t){var e=Math.cos(t),a=Math.cos(n)*e,c=Math.sin(n)*e,l=Math.sin(t),s=l*r+a*u;return[Math.atan2(c*i-s*o,a*r-l*u),O(s*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,l=Math.sin(t),s=l*i-c*o;return[Math.atan2(c*i+l*o,a*r+s*u),O(s*r-a*u)]},e}function Te(n,t){var e=Math.cos(n),r=Math.sin(n);return function(u,i,o,a){var c=o*t;null!=u?(u=qe(e,u),i=qe(e,i),(o>0?i>u:u>i)&&(u+=o*Wo)):(u=n+o*Wo,i=n-.5*c);for(var l,s=u;o>0?s>i:i>s;s-=c)a.point((l=Pt([e,-r*Math.cos(s),-r*Math.sin(s)]))[0],l[1])}}function qe(n,t){var e=Ct(t);e[0]-=n,Ft(e);var r=P(-e[1]);return((-e[2]<0?-r:r)+2*Math.PI-Go)%(2*Math.PI)}function ze(n,t,e){var r=mo.range(n,t-Go,e).concat(t);return function(n){return r.map(function(t){return[n,t]})}}function Ce(n,t,e){var r=mo.range(n,t-Go,e).concat(t);return function(n){return r.map(function(t){return[t,n]})}}function De(n){return n.source}function je(n){return n.target}function Le(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),l=u*Math.sin(n),s=o*Math.cos(e),f=o*Math.sin(e),h=2*Math.asin(Math.sqrt(U(r-t)+u*o*U(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*s,u=e*l+t*f,o=e*i+t*a;return[Math.atan2(u,r)*na,Math.atan2(o,Math.sqrt(r*r+u*u))*na]}:function(){return[n*na,t*na]};return p.distance=h,p}function He(){function n(n,u){var i=Math.sin(u*=Qo),o=Math.cos(u),a=Math.abs((n*=Qo)-t),c=Math.cos(a);oc+=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;ac.point=function(u,i){t=u*Qo,e=Math.sin(i*=Qo),r=Math.cos(i),ac.point=n},ac.lineEnd=function(){ac.point=ac.lineEnd=c}}function Fe(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&&e*i/r)]},e}function Pe(n,t){function e(n,t){var e=Math.abs(Math.abs(t)-Jo)<Go?0: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(Bo/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=F(i)*Math.sqrt(n*n+e*e);return[Math.atan2(n,e)/i,2*Math.atan(Math.pow(o/r,1/i))-Jo]},e):Re}function Oe(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 Math.abs(u)<Go?we:(e.invert=function(n,t){var e=i-t;return[Math.atan2(n,e)/u,i-F(u)*Math.sqrt(n*n+e*e)]},e)}function Re(n,t){return[n,Math.log(Math.tan(Bo/4+t/2))]}function Ye(n){var t,e=xe(n),r=e.scale,u=e.translate,i=e.clipExtent;return e.scale=function(){var n=r.apply(e,arguments);return 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=Bo*r(),c=u();i([[c[0]-a,c[1]-a],[c[0]+a,c[1]+a]])}}else t&&(o=null);return o},e.clipExtent(null)}function Ie(n,t){var e=Math.cos(t)*Math.sin(n);return[Math.log((1+e)/(1-e))/2,Math.atan2(Math.tan(t),Math.cos(n))]}function Ue(n){function t(t){function o(){l.push("M",i(n(s),a))}for(var c,l=[],s=[],f=-1,h=t.length,g=pt(e),p=pt(r);++f<h;)u.call(this,c=t[f],f)?s.push([+g.call(this,c,f),+p.call(this,c,f)]):s.length&&(o(),s=[]);return s.length&&o(),l.length?l.join(""):null}var e=Ze,r=Ve,u=Vt,i=Xe,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="function"==typeof n?i=n:(i=gc.get(n)||Xe).key,t):o},t.tension=function(n){return arguments.length?(a=n,t):a},t}function Ze(n){return n[0]}function Ve(n){return n[1]}function Xe(n){return n.join("L")}function $e(n){return Xe(n)+"Z"}function Be(n){for(var t=0,e=n.length,r=n[0],u=[r[0],",",r[1]];++t<e;)u.push("H",(r[0]+(r=n[t])[0])/2,"V",r[1]);return e>1&&u.push("H",r[0]),u.join("")}function We(n){for(var t=0,e=n.length,r=n[0],u=[r[0],",",r[1]];++t<e;)u.push("V",(r=n[t])[1],"H",r[0]);return u.join("")}function Je(n){for(var t=0,e=n.length,r=n[0],u=[r[0],",",r[1]];++t<e;)u.push("H",(r=n[t])[0],"V",r[1]);return u.join("")}function Ge(n,t){return n.length<4?Xe(n):n[1]+nr(n.slice(1,n.length-1),tr(n,t))}function Ke(n,t){return n.length<3?Xe(n):n[0]+nr((n.push(n[0]),n),tr([n[n.length-2]].concat(n,[n[1]]),t))}function Qe(n,t){return n.length<3?Xe(n):n[0]+nr(n,tr(n,t))}function nr(n,t){if(t.length<1||n.length!=t.length&&n.length!=t.length+2)return Xe(n);var e=n.length!=t.length,r="",u=n[0],i=n[1],o=t[0],a=o,c=1;if(e&&(r+="Q"+(i[0]-2*o[0]/3)+","+(i[1]-2*o[1]/3)+","+i[0]+","+i[1],u=n[1],c=2),t.length>1){a=t[1],i=n[c],c++,r+="C"+(u[0]+o[0])+","+(u[1]+o[1])+","+(i[0]-a[0])+","+(i[1]-a[1])+","+i[0]+","+i[1];for(var l=2;l<t.length;l++,c++)i=n[c],a=t[l],r+="S"+(i[0]-a[0])+","+(i[1]-a[1])+","+i[0]+","+i[1]}if(e){var s=n[c];r+="Q"+(i[0]+2*a[0]/3)+","+(i[1]+2*a[1]/3)+","+s[0]+","+s[1]}return r}function tr(n,t){for(var e,r=[],u=(1-t)/2,i=n[0],o=n[1],a=1,c=n.length;++a<c;)e=i,i=o,o=n[a],r.push([u*(o[0]-e[0]),u*(o[1]-e[1])]);return r}function er(n){if(n.length<3)return Xe(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,",",i,"L",or(vc,o),",",or(vc,a)];for(n.push(n[e-1]);++t<=e;)r=n[t],o.shift(),o.push(r[0]),a.shift(),a.push(r[1]),ar(c,o,a);return n.pop(),c.push("L",r),c.join("")}function rr(n){if(n.length<4)return Xe(n);for(var t,e=[],r=-1,u=n.length,i=[0],o=[0];++r<3;)t=n[r],i.push(t[0]),o.push(t[1]);for(e.push(or(vc,i)+","+or(vc,o)),--r;++r<u;)t=n[r],i.shift(),i.push(t[0]),o.shift(),o.push(t[1]),ar(e,i,o);return e.join("")}function ur(n){for(var t,e,r=-1,u=n.length,i=u+4,o=[],a=[];++r<4;)e=n[r%u],o.push(e[0]),a.push(e[1]);for(t=[or(vc,o),",",or(vc,a)],--r;++r<i;)e=n[r%u],o.shift(),o.push(e[0]),a.shift(),a.push(e[1]),ar(t,o,a);return t.join("")}function ir(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,l=-1;++l<=e;)r=n[l],u=l/e,r[0]=t*r[0]+(1-t)*(i+u*a),r[1]=t*r[1]+(1-t)*(o+u*c);return er(n)}function or(n,t){return n[0]*t[0]+n[1]*t[1]+n[2]*t[2]+n[3]*t[3]}function ar(n,t,e){n.push("C",or(pc,t),",",or(pc,e),",",or(dc,t),",",or(dc,e),",",or(vc,t),",",or(vc,e))}function cr(n,t){return(t[1]-n[1])/(t[0]-n[0])}function lr(n){for(var t=0,e=n.length-1,r=[],u=n[0],i=n[1],o=r[0]=cr(u,i);++t<e;)r[t]=(o+(o=cr(u=i,i=n[t+1])))/2;return r[t]=o,r
    }function sr(n){for(var t,e,r,u,i=[],o=lr(n),a=-1,c=n.length-1;++a<c;)t=cr(n[a],n[a+1]),Math.abs(t)<Go?o[a]=o[a+1]=0:(e=o[a]/t,r=o[a+1]/t,u=e*e+r*r,u>9&&(u=3*t/Math.sqrt(u),o[a]=u*e,o[a+1]=u*r));for(a=-1;++a<=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 fr(n){return n.length<3?Xe(n):n[0]+nr(n,sr(n))}function hr(n,t,e,r){var u,i,o,a,c,l,s;return u=r[n],i=u[0],o=u[1],u=r[t],a=u[0],c=u[1],u=r[e],l=u[0],s=u[1],(s-o)*(a-i)-(c-o)*(l-i)>0}function gr(n,t,e){return(e[0]-t[0])*(n[1]-t[1])<(e[1]-t[1])*(n[0]-t[0])}function pr(n,t,e,r){var u=n[0],i=e[0],o=t[0]-u,a=r[0]-i,c=n[1],l=e[1],s=t[1]-c,f=r[1]-l,h=(a*(c-l)-f*(u-i))/(f*o-a*s);return[u+h*o,c+h*s]}function dr(n){var t=n[0],e=n[n.length-1];return!(t[0]-e[0]||t[1]-e[1])}function vr(n,t){var e={list:n.map(function(n,t){return{index:t,x:n[0],y:n[1]}}).sort(function(n,t){return n.y<t.y?-1:n.y>t.y?1:n.x<t.x?-1:n.x>t.x?1:0}),bottomSite:null},r={list:[],leftEnd:null,rightEnd:null,init:function(){r.leftEnd=r.createHalfEdge(null,"l"),r.rightEnd=r.createHalfEdge(null,"l"),r.leftEnd.r=r.rightEnd,r.rightEnd.l=r.leftEnd,r.list.unshift(r.leftEnd,r.rightEnd)},createHalfEdge:function(n,t){return{edge:n,side:t,vertex:null,l:null,r:null}},insert:function(n,t){t.l=n,t.r=n.r,n.r.l=t,n.r=t},leftBound:function(n){var t=r.leftEnd;do t=t.r;while(t!=r.rightEnd&&u.rightOf(t,n));return t=t.l},del:function(n){n.l.r=n.r,n.r.l=n.l,n.edge=null},right:function(n){return n.r},left:function(n){return n.l},leftRegion:function(n){return null==n.edge?e.bottomSite:n.edge.region[n.side]},rightRegion:function(n){return null==n.edge?e.bottomSite:n.edge.region[yc[n.side]]}},u={bisect:function(n,t){var e={region:{l:n,r:t},ep:{l:null,r:null}},r=t.x-n.x,u=t.y-n.y,i=r>0?r:-r,o=u>0?u:-u;return e.c=n.x*r+n.y*u+.5*(r*r+u*u),i>o?(e.a=1,e.b=u/r,e.c/=r):(e.b=1,e.a=r/u,e.c/=u),e},intersect:function(n,t){var e=n.edge,r=t.edge;if(!e||!r||e.region.r==r.region.r)return null;var u=e.a*r.b-e.b*r.a;if(Math.abs(u)<1e-10)return null;var i,o,a=(e.c*r.b-r.c*e.b)/u,c=(r.c*e.a-e.c*r.a)/u,l=e.region.r,s=r.region.r;l.y<s.y||l.y==s.y&&l.x<s.x?(i=n,o=e):(i=t,o=r);var f=a>=o.region.r.x;return f&&"l"===i.side||!f&&"r"===i.side?null:{x:a,y:c}},rightOf:function(n,t){var e=n.edge,r=e.region.r,u=t.x>r.x;if(u&&"l"===n.side)return 1;if(!u&&"r"===n.side)return 0;if(1===e.a){var i=t.y-r.y,o=t.x-r.x,a=0,c=0;if(!u&&e.b<0||u&&e.b>=0?c=a=i>=e.b*o:(c=t.x+t.y*e.b>e.c,e.b<0&&(c=!c),c||(a=1)),!a){var l=r.x-e.region.l.x;c=e.b*(o*o-i*i)<l*i*(1+2*o/l+e.b*e.b),e.b<0&&(c=!c)}}else{var s=e.c-e.a*t.x,f=t.y-s,h=t.x-r.x,g=s-r.y;c=f*f>h*h+g*g}return"l"===n.side?c:!c},endPoint:function(n,e,r){n.ep[e]=r,n.ep[yc[e]]&&t(n)},distance:function(n,t){var e=n.x-t.x,r=n.y-t.y;return Math.sqrt(e*e+r*r)}},i={list:[],insert:function(n,t,e){n.vertex=t,n.ystar=t.y+e;for(var r=0,u=i.list,o=u.length;o>r;r++){var a=u[r];if(!(n.ystar>a.ystar||n.ystar==a.ystar&&t.x>a.vertex.x))break}u.splice(r,0,n)},del:function(n){for(var t=0,e=i.list,r=e.length;r>t&&e[t]!=n;++t);e.splice(t,1)},empty:function(){return 0===i.list.length},nextEvent:function(n){for(var t=0,e=i.list,r=e.length;r>t;++t)if(e[t]==n)return e[t+1];return null},min:function(){var n=i.list[0];return{x:n.vertex.x,y:n.ystar}},extractMin:function(){return i.list.shift()}};r.init(),e.bottomSite=e.list.shift();for(var o,a,c,l,s,f,h,g,p,d,v,m,y,M=e.list.shift();;)if(i.empty()||(o=i.min()),M&&(i.empty()||M.y<o.y||M.y==o.y&&M.x<o.x))a=r.leftBound(M),c=r.right(a),h=r.rightRegion(a),m=u.bisect(h,M),f=r.createHalfEdge(m,"l"),r.insert(a,f),d=u.intersect(a,f),d&&(i.del(a),i.insert(a,d,u.distance(d,M))),a=f,f=r.createHalfEdge(m,"r"),r.insert(a,f),d=u.intersect(f,c),d&&i.insert(f,d,u.distance(d,M)),M=e.list.shift();else{if(i.empty())break;a=i.extractMin(),l=r.left(a),c=r.right(a),s=r.right(c),h=r.leftRegion(a),g=r.rightRegion(c),v=a.vertex,u.endPoint(a.edge,a.side,v),u.endPoint(c.edge,c.side,v),r.del(a),i.del(c),r.del(c),y="l",h.y>g.y&&(p=h,h=g,g=p,y="r"),m=u.bisect(h,g),f=r.createHalfEdge(m,y),r.insert(l,f),u.endPoint(m,yc[y],v),d=u.intersect(l,f),d&&(i.del(l),i.insert(l,d,u.distance(d,h))),d=u.intersect(f,s),d&&i.insert(f,d,u.distance(d,h))}for(a=r.right(r.leftEnd);a!=r.rightEnd;a=r.right(a))t(a.edge)}function mr(n){return n.x}function yr(n){return n.y}function Mr(){return{leaf:!0,nodes:[],point:null,x:null,y:null}}function xr(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]&&xr(n,c[0],e,r,o,a),c[1]&&xr(n,c[1],o,r,u,a),c[2]&&xr(n,c[2],e,a,o,i),c[3]&&xr(n,c[3],o,a,u,i)}}function br(n,t){n=mo.rgb(n),t=mo.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"#"+ct(Math.round(e+i*n))+ct(Math.round(r+o*n))+ct(Math.round(u+a*n))}}function _r(n,t){var e,r={},u={};for(e in n)e in t?r[e]=Er(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 wr(n,t){return t-=n=+n,function(e){return n+t*e}}function Sr(n,t){var e,r,u,i,o,a=0,c=0,l=[],s=[];for(n+="",t+="",Mc.lastIndex=0,r=0;e=Mc.exec(t);++r)e.index&&l.push(t.substring(a,c=e.index)),s.push({i:l.length,x:e[0]}),l.push(null),a=Mc.lastIndex;for(a<t.length&&l.push(t.substring(a)),r=0,i=s.length;(e=Mc.exec(n))&&i>r;++r)if(o=s[r],o.x==e[0]){if(o.i)if(null==l[o.i+1])for(l[o.i-1]+=o.x,l.splice(o.i,1),u=r+1;i>u;++u)s[u].i--;else for(l[o.i-1]+=o.x+l[o.i+1],l.splice(o.i,2),u=r+1;i>u;++u)s[u].i-=2;else if(null==l[o.i+1])l[o.i]=o.x;else for(l[o.i]=o.x+l[o.i+1],l.splice(o.i+1,1),u=r+1;i>u;++u)s[u].i--;s.splice(r,1),i--,r--}else o.x=wr(parseFloat(e[0]),parseFloat(o.x));for(;i>r;)o=s.pop(),null==l[o.i+1]?l[o.i]=o.x:(l[o.i]=o.x+l[o.i+1],l.splice(o.i+1,1)),i--;return 1===l.length?null==l[0]?(o=s[0].x,function(n){return o(n)+""}):function(){return t}:function(n){for(r=0;i>r;++r)l[(o=s[r]).i]=o.x(n);return l.join("")}}function Er(n,t){for(var e,r=mo.interpolators.length;--r>=0&&!(e=mo.interpolators[r](n,t)););return e}function kr(n,t){var e,r=[],u=[],i=n.length,o=t.length,a=Math.min(n.length,t.length);for(e=0;a>e;++e)r.push(Er(n[e],t[e]));for(;i>e;++e)u[e]=n[e];for(;o>e;++e)u[e]=t[e];return function(n){for(e=0;a>e;++e)u[e]=r[e](n);return u}}function Ar(n){return function(t){return 0>=t?0:t>=1?1:n(t)}}function Nr(n){return function(t){return 1-n(1-t)}}function Tr(n){return function(t){return.5*(.5>t?n(2*t):2-n(2-2*t))}}function qr(n){return n*n}function zr(n){return n*n*n}function Cr(n){if(0>=n)return 0;if(n>=1)return 1;var t=n*n,e=t*n;return 4*(.5>n?e:3*(n-t)+e-.75)}function Dr(n){return function(t){return Math.pow(t,n)}}function jr(n){return 1-Math.cos(n*Jo)}function Lr(n){return Math.pow(2,10*(n-1))}function Hr(n){return 1-Math.sqrt(1-n*n)}function Fr(n,t){var e;return arguments.length<2&&(t=.45),arguments.length?e=t/Wo*Math.asin(1/n):(n=1,e=t/4),function(r){return 1+n*Math.pow(2,-10*r)*Math.sin((r-e)*Wo/t)}}function Pr(n){return n||(n=1.70158),function(t){return t*t*((n+1)*t-n)}}function Or(n){return 1/2.75>n?7.5625*n*n:2/2.75>n?7.5625*(n-=1.5/2.75)*n+.75:2.5/2.75>n?7.5625*(n-=2.25/2.75)*n+.9375:7.5625*(n-=2.625/2.75)*n+.984375}function Rr(n,t){n=mo.hcl(n),t=mo.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)&&(o=0,r=isNaN(r)?t.c:r),isNaN(i)?(i=0,e=isNaN(e)?t.h:e):i>180?i-=360:-180>i&&(i+=360),function(n){return J(e+i*n,r+o*n,u+a*n)+""}}function Yr(n,t){n=mo.hsl(n),t=mo.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)&&(o=0,r=isNaN(r)?t.s:r),isNaN(i)?(i=0,e=isNaN(e)?t.h:e):i>180?i-=360:-180>i&&(i+=360),function(n){return $(e+i*n,r+o*n,u+a*n)+""}}function Ir(n,t){n=mo.lab(n),t=mo.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 Q(e+i*n,r+o*n,u+a*n)+""}}function Ur(n,t){return t-=n,function(e){return Math.round(n+t*e)}}function Zr(n){var t=[n.a,n.b],e=[n.c,n.d],r=Xr(t),u=Vr(t,e),i=Xr($r(e,t,-u))||0;t[0]*e[1]<e[0]*t[1]&&(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]))*na,this.translate=[n.e,n.f],this.scale=[r,i],this.skew=i?Math.atan2(u,i)*na:0}function Vr(n,t){return n[0]*t[0]+n[1]*t[1]}function Xr(n){var t=Math.sqrt(Vr(n,n));return t&&(n[0]/=t,n[1]/=t),t}function $r(n,t,e){return n[0]+=e*t[0],n[1]+=e*t[1],n}function Br(n,t){var e,r=[],u=[],i=mo.transform(n),o=mo.transform(t),a=i.translate,c=o.translate,l=i.rotate,s=o.rotate,f=i.skew,h=o.skew,g=i.scale,p=o.scale;return a[0]!=c[0]||a[1]!=c[1]?(r.push("translate(",null,",",null,")"),u.push({i:1,x:wr(a[0],c[0])},{i:3,x:wr(a[1],c[1])})):c[0]||c[1]?r.push("translate("+c+")"):r.push(""),l!=s?(l-s>180?s+=360:s-l>180&&(l+=360),u.push({i:r.push(r.pop()+"rotate(",null,")")-2,x:wr(l,s)})):s&&r.push(r.pop()+"rotate("+s+")"),f!=h?u.push({i:r.push(r.pop()+"skewX(",null,")")-2,x:wr(f,h)}):h&&r.push(r.pop()+"skewX("+h+")"),g[0]!=p[0]||g[1]!=p[1]?(e=r.push(r.pop()+"scale(",null,",",null,")"),u.push({i:e-4,x:wr(g[0],p[0])},{i:e-2,x:wr(g[1],p[1])})):(1!=p[0]||1!=p[1])&&r.push(r.pop()+"scale("+p+")"),e=u.length,function(n){for(var t,i=-1;++i<e;)r[(t=u[i]).i]=t.x(n);return r.join("")}}function Wr(n,t){return t=t-(n=+n)?1/(t-n):0,function(e){return(e-n)*t}}function Jr(n,t){return t=t-(n=+n)?1/(t-n):0,function(e){return Math.max(0,Math.min(1,(e-n)*t))}}function Gr(n){for(var t=n.source,e=n.target,r=Qr(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 Kr(n){for(var t=[],e=n.parent;null!=e;)t.push(n),n=e,e=e.parent;return t.push(n),t}function Qr(n,t){if(n===t)return n;for(var e=Kr(n),r=Kr(t),u=e.pop(),i=r.pop(),o=null;u===i;)o=u,u=e.pop(),i=r.pop();return o}function nu(n){n.fixed|=2}function tu(n){n.fixed&=-7}function eu(n){n.fixed|=4,n.px=n.x,n.py=n.y}function ru(n){n.fixed&=-5}function uu(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<a;)i=o[c],null!=i&&(uu(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 l=t*e[n.point.index];n.charge+=n.pointCharge=l,r+=l*n.point.x,u+=l*n.point.y}n.cx=r/n.charge,n.cy=u/n.charge}function iu(n,t){return mo.rebind(n,t,"sort","children","value"),n.nodes=n,n.links=lu,n}function ou(n){return n.children}function au(n){return n.value}function cu(n,t){return t.value-n.value}function lu(n){return mo.merge(n.map(function(n){return(n.children||[]).map(function(t){return{source:n,target:t}})}))}function su(n){return n.x}function fu(n){return n.y}function hu(n,t,e){n.y0=t,n.y=e}function gu(n){return mo.range(n.length)}function pu(n){for(var t=-1,e=n[0].length,r=[];++t<e;)r[t]=0;return r}function du(n){for(var t,e=1,r=0,u=n[0][1],i=n.length;i>e;++e)(t=n[e][1])>u&&(r=e,u=t);return r}function vu(n){return n.reduce(mu,0)}function mu(n,t){return n+t[1]}function yu(n,t){return Mu(n,Math.ceil(Math.log(t.length)/Math.LN2+1))}function Mu(n,t){for(var e=-1,r=+n[0],u=(n[1]-r)/t,i=[];++e<=t;)i[e]=u*e+r;return i}function xu(n){return[mo.min(n),mo.max(n)]}function bu(n,t){return n.parent==t.parent?1:2}function _u(n){var t=n.children;return t&&t.length?t[0]:n._tree.thread}function wu(n){var t,e=n.children;return e&&(t=e.length)?e[t-1]:n._tree.thread}function Su(n,t){var e=n.children;if(e&&(u=e.length))for(var r,u,i=-1;++i<u;)t(r=Su(e[i],t),n)>0&&(n=r);return n}function Eu(n,t){return n.x-t.x}function ku(n,t){return t.x-n.x}function Au(n,t){return n.depth-t.depth}function Nu(n,t){function e(n,r){var u=n.children;if(u&&(o=u.length))for(var i,o,a=null,c=-1;++c<o;)i=u[c],e(i,a),a=i;t(n,r)}e(n,null)}function Tu(n){for(var t,e=0,r=0,u=n.children,i=u.length;--i>=0;)t=u[i]._tree,t.prelim+=e,t.mod+=e,e+=t.shift+(r+=t.change)}function qu(n,t,e){n=n._tree,t=t._tree;var r=e/(t.number-n.number);n.change+=r,t.change-=r,t.shift+=e,t.prelim+=e,t.mod+=e}function zu(n,t,e){return n._tree.ancestor.parent==t.parent?n._tree.ancestor:e}function Cu(n,t){return n.value-t.value}function Du(n,t){var e=n._pack_next;n._pack_next=t,t._pack_prev=n,t._pack_next=e,e._pack_prev=t}function ju(n,t){n._pack_next=t,t._pack_prev=n}function Lu(n,t){var e=t.x-n.x,r=t.y-n.y,u=n.r+t.r;return.999*u*u>e*e+r*r}function Hu(n){function t(n){s=Math.min(n.x-n.r,s),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)&&(l=e.length)){var e,r,u,i,o,a,c,l,s=1/0,f=-1/0,h=1/0,g=-1/0;if(e.forEach(Fu),r=e[0],r.x=-r.r,r.y=0,t(r),l>1&&(u=e[1],u.x=u.r,u.y=0,t(u),l>2))for(i=e[2],Ru(r,u,i),t(i),Du(r,i),r._pack_prev=i,Du(i,u),u=r._pack_next,o=3;l>o;o++){Ru(r,u,i=e[o]);var p=0,d=1,v=1;for(a=u._pack_next;a!==u;a=a._pack_next,d++)if(Lu(a,i)){p=1;break}if(1==p)for(c=r._pack_prev;c!==a._pack_prev&&!Lu(c,i);c=c._pack_prev,v++);p?(v>d||d==v&&u.r<r.r?ju(r,u=a):ju(r=c,u),o--):(Du(r,i),u=i,t(i))}var m=(s+f)/2,y=(h+g)/2,M=0;for(o=0;l>o;o++)i=e[o],i.x-=m,i.y-=y,M=Math.max(M,i.r+Math.sqrt(i.x*i.x+i.y*i.y));n.r=M,e.forEach(Pu)}}function Fu(n){n._pack_next=n._pack_prev=n}function Pu(n){delete n._pack_next,delete n._pack_prev}function Ou(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<o;)Ou(u[i],t,e,r)}function Ru(n,t,e){var r=n.r+e.r,u=t.x-n.x,i=t.y-n.y;if(r&&(u||i)){var o=t.r+e.r,a=u*u+i*i;o*=o,r*=r;var c=.5+(r-o)/(2*a),l=Math.sqrt(Math.max(0,2*o*(r+a)-(r-=a)*r-o*o))/(2*a);e.x=n.x+c*u+l*i,e.y=n.y+c*i-l*u}else e.x=n.x+r,e.y=n.y}function Yu(n){return 1+mo.max(n,function(n){return n.y})}function Iu(n){return n.reduce(function(n,t){return n+t.x},0)/n.length}function Uu(n){var t=n.children;return t&&t.length?Uu(t[0]):n}function Zu(n){var t,e=n.children;return e&&(t=e.length)?Zu(e[t-1]):n}function Vu(n){return{x:n.x,y:n.y,dx:n.dx,dy:n.dy}}function Xu(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>u&&(e+=u/2,u=0),0>i&&(r+=i/2,i=0),{x:e,y:r,dx:u,dy:i}}function $u(n){var t=n[0],e=n[n.length-1];return e>t?[t,e]:[e,t]}function Bu(n){return n.rangeExtent?n.rangeExtent():$u(n.range())}function Wu(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 Ju(n,t){var e,r=0,u=n.length-1,i=n[r],o=n[u];return i>o&&(e=r,r=u,u=e,e=i,i=o,o=e),n[r]=t.floor(i),n[u]=t.ceil(o),n}function Gu(n){return n?{floor:function(t){return Math.floor(t/n)*n},ceil:function(t){return Math.ceil(t/n)*n}}:Tc}function Ku(n,t,e,r){var u=[],i=[],o=0,a=Math.min(n.length,t.length)-1;for(n[a]<n[0]&&(n=n.slice().reverse(),t=t.slice().reverse());++o<=a;)u.push(e(n[o-1],n[o])),i.push(r(t[o-1],t[o]));return function(t){var e=mo.bisect(n,t,1,a)-1;return i[e](u[e](t))}}function Qu(n,t,e,r){function u(){var u=Math.min(n.length,t.length)>2?Ku:Wu,c=r?Jr:Wr;return o=u(n,t,c,e),a=u(t,n,c,Er),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(Ur)},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 ri(n,t)},i.tickFormat=function(t,e){return ui(n,t,e)},i.nice=function(t){return ti(n,t),u()},i.copy=function(){return Qu(n,t,e,r)},u()}function ni(n,t){return mo.rebind(n,t,"range","rangeRound","interpolate","clamp")}function ti(n,t){return Ju(n,Gu(ei(n,t)[2]))}function ei(n,t){null==t&&(t=10);var e=$u(n),r=e[1]-e[0],u=Math.pow(10,Math.floor(Math.log(r/t)/Math.LN10)),i=t/r*u;return.15>=i?u*=10:.35>=i?u*=5:.75>=i&&(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 ri(n,t){return mo.range.apply(mo,ei(n,t))}function ui(n,t,e){var r=-Math.floor(Math.log(ei(n,t)[2])/Math.LN10+.01);return mo.format(e?e.replace(Aa,function(n,t,e,u,i,o,a,c,l,s){return[t,e,u,i,o,a,c,l||"."+(r-2*("%"===s)),s].join("")}):",."+r+"f")}function ii(n,t,e,r){function u(n){return(e?Math.log(0>n?0:n):-Math.log(n>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]>=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=Ju(r.map(u),e?Math:zc);return n.domain(t),r=t.map(i),o},o.ticks=function(){var n=$u(r),o=[],a=n[0],c=n[1],l=Math.floor(u(a)),s=Math.ceil(u(c)),f=t%1?2:t;if(isFinite(s-l)){if(e){for(;s>l;l++)for(var h=1;f>h;h++)o.push(i(l)*h);o.push(i(l))}else for(o.push(i(l));l++<s;)for(var h=f-1;h>0;h--)o.push(i(l)*h);for(l=0;o[l]<a;l++);for(s=o.length;o[s-1]>c;s--);o=o.slice(l,s)}return o},o.tickFormat=function(n,t){if(!arguments.length)return qc;arguments.length<2?t=qc:"function"!=typeof t&&(t=mo.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))<=a?t(n):""}},o.copy=function(){return ii(n.copy(),t,e,r)},ni(o,n)}function oi(n,t,e){function r(t){return n(u(t))}var u=ai(t),i=ai(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 ri(e,n)},r.tickFormat=function(n,t){return ui(e,n,t)},r.nice=function(n){return r.domain(ti(e,n))},r.exponent=function(o){return arguments.length?(u=ai(t=o),i=ai(1/t),n.domain(e.map(u)),r):t},r.copy=function(){return oi(n.copy(),t,e)},ni(r,n)}function ai(n){return function(t){return 0>t?-Math.pow(-t,n):Math.pow(t,n)}}function ci(n,t){function e(e){return o[((i.get(e)||"range"===t.t&&i.set(e,n.push(e)))-1)%o.length]}function r(t,e){return mo.range(n.length).map(function(n){return t+e*n})}var i,o,a;return e.domain=function(r){if(!arguments.length)return n;n=[],i=new u;for(var o,a=-1,c=r.length;++a<c;)i.has(o=r[a])||i.set(o,n.push(o));return e[t.t].apply(e,t.a)},e.range=function(n){return arguments.length?(o=n,a=0,t={t:"range",a:arguments},e):o},e.rangePoints=function(u,i){arguments.length<2&&(i=0);var c=u[0],l=u[1],s=(l-c)/(Math.max(1,n.length-1)+i);return o=r(n.length<2?(c+l)/2:c+s*i/2,s),a=0,t={t:"rangePoints",a:arguments},e},e.rangeBands=function(u,i,c){arguments.length<2&&(i=0),arguments.length<3&&(c=i);var l=u[1]<u[0],s=u[l-0],f=u[1-l],h=(f-s)/(n.length-i+2*c);return o=r(s+h*c,h),l&&o.reverse(),a=h*(1-i),t={t:"rangeBands",a:arguments},e},e.rangeRoundBands=function(u,i,c){arguments.length<2&&(i=0),arguments.length<3&&(c=i);var l=u[1]<u[0],s=u[l-0],f=u[1-l],h=Math.floor((f-s)/(n.length-i+2*c)),g=f-s-(n.length-i)*h;return o=r(s+Math.round(g/2),h),l&&o.reverse(),a=Math.round(h*(1-i)),t={t:"rangeRoundBands",a:arguments},e},e.rangeBand=function(){return a},e.rangeExtent=function(){return $u(t.a[0])},e.copy=function(){return ci(n,t)},e.domain(n)}function li(n,t){function e(){var e=0,i=t.length;for(u=[];++e<i;)u[e-1]=mo.quantile(n,e/i);return r}function r(n){return isNaN(n=+n)?void 0:t[mo.bisect(u,n)]}var u;return r.domain=function(t){return arguments.length?(n=t.filter(function(n){return!isNaN(n)}).sort(mo.ascending),e()):n},r.range=function(n){return arguments.length?(t=n,e()):t},r.quantiles=function(){return u},r.invertExtent=function(e){return e=t.indexOf(e),0>e?[0/0,0/0]:[e>0?u[e-1]:n[0],e<u.length?u[e]:n[n.length-1]]},r.copy=function(){return li(n,t)},e()}function si(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>t?0/0:t/i+n,[t,t+1/i]},r.copy=function(){return si(n,t,e)},u()}function fi(n,t){function e(e){return e>=e?t[mo.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 fi(n,t)},e}function hi(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 ri(n,t)},t.tickFormat=function(t,e){return ui(n,t,e)},t.copy=function(){return hi(n)},t}function gi(n){return n.innerRadius}function pi(n){return n.outerRadius}function di(n){return n.startAngle}function vi(n){return n.endAngle}function mi(n){for(var t,e,r,u=-1,i=n.length;++u<i;)t=n[u],e=t[0],r=t[1]+Hc,t[0]=e*Math.cos(r),t[1]=e*Math.sin(r);return n}function yi(n){function t(t){function c(){d.push("M",a(n(m),f),s,l(n(v.reverse()),f),"Z")}for(var h,g,p,d=[],v=[],m=[],y=-1,M=t.length,x=pt(e),b=pt(u),_=e===r?function(){return g}:pt(r),w=u===i?function(){return p}:pt(i);++y<M;)o.call(this,h=t[y],y)?(v.push([g=+x.call(this,h,y),p=+b.call(this,h,y)]),m.push([+_.call(this,h,y),+w.call(this,h,y)])):v.length&&(c(),v=[],m=[]);return v.length&&c(),d.length?d.join(""):null}var e=Ze,r=Ze,u=0,i=Ve,o=Vt,a=Xe,c=a.key,l=a,s="L",f=.7;return t.x=function(n){return arguments.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="function"==typeof n?a=n:(a=gc.get(n)||Xe).key,l=a.reverse||a,s=a.closed?"M":"L",t):c},t.tension=function(n){return arguments.length?(f=n,t):f},t}function Mi(n){return n.radius}function xi(n){return[n.x,n.y]}function bi(n){return function(){var t=n.apply(this,arguments),e=t[0],r=t[1]+Hc;return[e*Math.cos(r),e*Math.sin(r)]}}function _i(){return 64}function wi(){return"circle"}function Si(n){var t=Math.sqrt(n/Bo);return"M0,"+t+"A"+t+","+t+" 0 1,1 0,"+-t+"A"+t+","+t+" 0 1,1 0,"+t+"Z"}function Ei(n,t){return Lo(n,Uc),n.id=t,n}function ki(n,t,e,r){var u=n.id;return N(n,"function"==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 Ai(n){return null==n&&(n=""),function(){this.textContent=n}}function Ni(n,t,e,r){var i=n.__transition__||(n.__transition__={active:0,count:0}),o=i[e];if(!o){var a=r.time;o=i[e]={tween:new u,time:a,ease:r.ease,delay:r.delay,duration:r.duration},++i.count,mo.timer(function(r){function u(r){return i.active>e?l():(i.active=e,o.event&&o.event.start.call(n,s,t),o.tween.forEach(function(e,r){(r=r.call(n,s,t))&&p.push(r)}),c(r||1)?1:(xt(c,h,a),void 0))}function c(r){if(i.active!==e)return l();for(var u=r/g,a=f(u),c=p.length;c>0;)p[--c].call(n,a);return u>=1?(o.event&&o.event.end.call(n,s,t),l()):void 0}function l(){return--i.count?delete i[e]:delete n.__transition__,1}var s=n.__data__,f=o.ease,h=o.delay,g=o.duration,p=[];return r>=h?u(r-h):(xt(u,h,a),void 0)},0,a)}}function Ti(n,t){n.attr("transform",function(n){return"translate("+t(n)+",0)"})}function qi(n,t){n.attr("transform",function(n){return"translate(0,"+t(n)+")"})}function zi(){this._=new Date(arguments.length>1?Date.UTC.apply(this,arguments):arguments[0])}function Ci(n,t,e){function r(t){var e=n(t),r=i(e,1);return r-t>t-e?e:r}function u(e){return t(e=n(new Jc(e-1)),1),e}function i(n,e){return t(n=new Jc(+n),e),n}function o(n,r,i){var o=u(n),a=[];if(i>1)for(;r>o;)e(o)%i||a.push(new Date(+o)),t(o,1);else for(;r>o;)a.push(new Date(+o)),t(o,1);return a}function a(n,t,e){try{Jc=zi;var r=new zi;return r._=n,o(r,t,e)}finally{Jc=Date}}n.floor=n,n.round=r,n.ceil=u,n.offset=i,n.range=o;var c=n.utc=Di(n);return c.floor=c,c.round=Di(r),c.ceil=Di(u),c.offset=Di(i),c.range=a,n}function Di(n){return function(t,e){try{Jc=zi;var r=new zi;return r._=t,n(r,e)._}finally{Jc=Date}}}function ji(n){function t(t){for(var r,u,i,o=[],a=-1,c=0;++a<e;)37===n.charCodeAt(a)&&(o.push(n.substring(c,a)),null!=(u=dl[r=n.charAt(++a)])&&(r=n.charAt(++a)),(i=vl[r])&&(r=i(t,null==u?"e"===r?" ":"0":u)),o.push(r),c=a+1);return o.push(n.substring(c,a)),o.join("")}var e=n.length;return t.parse=function(t){var e={y:1900,m:0,d:1,H:0,M:0,S:0,L:0,Z:null},r=Li(e,n,t,0);if(r!=t.length)return null;"p"in e&&(e.H=e.H%12+12*e.p);var u=null!=e.Z&&Jc!==zi,i=new(u?zi:Jc);return"j"in e?i.setFullYear(e.y,0,e.j):"w"in e&&("W"in e||"U"in e)?(i.setFullYear(e.y,0,1),i.setFullYear(e.y,0,"W"in e?(e.w+6)%7+7*e.W-(i.getDay()+5)%7:e.w+7*e.U-(i.getDay()+6)%7)):i.setFullYear(e.y,e.m,e.d),i.setHours(e.H+Math.floor(e.Z/100),e.M+e.Z%100,e.S,e.L),u?i._:i},t.toString=function(){return n},t}function Li(n,t,e,r){for(var u,i,o,a=0,c=t.length,l=e.length;c>a;){if(r>=l)return-1;if(u=t.charCodeAt(a++),37===u){if(o=t.charAt(a++),i=ml[o in dl?t.charAt(a++):o],!i||(r=i(n,e,r))<0)return-1}else if(u!=e.charCodeAt(r++))return-1}return r}function Hi(n){return new RegExp("^(?:"+n.map(mo.requote).join("|")+")","i")}function Fi(n){for(var t=new u,e=-1,r=n.length;++e<r;)t.set(n[e].toLowerCase(),e);return t}function Pi(n,t,e){var r=0>n?"-":"",u=(r?-n:n)+"",i=u.length;return r+(e>i?new Array(e-i+1).join(t)+u:u)}function Oi(n,t,e){cl.lastIndex=0;var r=cl.exec(t.substring(e));return r?(n.w=ll.get(r[0].toLowerCase()),e+r[0].length):-1}function Ri(n,t,e){ol.lastIndex=0;var r=ol.exec(t.substring(e));return r?(n.w=al.get(r[0].toLowerCase()),e+r[0].length):-1}function Yi(n,t,e){yl.lastIndex=0;var r=yl.exec(t.substring(e,e+1));return r?(n.w=+r[0],e+r[0].length):-1}function Ii(n,t,e){yl.lastIndex=0;var r=yl.exec(t.substring(e));return r?(n.U=+r[0],e+r[0].length):-1}function Ui(n,t,e){yl.lastIndex=0;var r=yl.exec(t.substring(e));return r?(n.W=+r[0],e+r[0].length):-1}function Zi(n,t,e){hl.lastIndex=0;var r=hl.exec(t.substring(e));return r?(n.m=gl.get(r[0].toLowerCase()),e+r[0].length):-1}function Vi(n,t,e){sl.lastIndex=0;var r=sl.exec(t.substring(e));return r?(n.m=fl.get(r[0].toLowerCase()),e+r[0].length):-1}function Xi(n,t,e){return Li(n,vl.c.toString(),t,e)}function $i(n,t,e){return Li(n,vl.x.toString(),t,e)}function Bi(n,t,e){return Li(n,vl.X.toString(),t,e)}function Wi(n,t,e){yl.lastIndex=0;var r=yl.exec(t.substring(e,e+4));return r?(n.y=+r[0],e+r[0].length):-1}function Ji(n,t,e){yl.lastIndex=0;var r=yl.exec(t.substring(e,e+2));return r?(n.y=Ki(+r[0]),e+r[0].length):-1}function Gi(n,t,e){return/^[+-]\d{4}$/.test(t=t.substring(e,e+5))?(n.Z=+t,e+5):-1}function Ki(n){return n+(n>68?1900:2e3)}function Qi(n,t,e){yl.lastIndex=0;var r=yl.exec(t.substring(e,e+2));return r?(n.m=r[0]-1,e+r[0].length):-1}function no(n,t,e){yl.lastIndex=0;var r=yl.exec(t.substring(e,e+2));return r?(n.d=+r[0],e+r[0].length):-1}function to(n,t,e){yl.lastIndex=0;var r=yl.exec(t.substring(e,e+3));return r?(n.j=+r[0],e+r[0].length):-1}function eo(n,t,e){yl.lastIndex=0;var r=yl.exec(t.substring(e,e+2));return r?(n.H=+r[0],e+r[0].length):-1}function ro(n,t,e){yl.lastIndex=0;var r=yl.exec(t.substring(e,e+2));return r?(n.M=+r[0],e+r[0].length):-1}function uo(n,t,e){yl.lastIndex=0;var r=yl.exec(t.substring(e,e+2));return r?(n.S=+r[0],e+r[0].length):-1}function io(n,t,e){yl.lastIndex=0;var r=yl.exec(t.substring(e,e+3));return r?(n.L=+r[0],e+r[0].length):-1}function oo(n,t,e){var r=Ml.get(t.substring(e,e+=2).toLowerCase());return null==r?-1:(n.p=r,e)}function ao(n){var t=n.getTimezoneOffset(),e=t>0?"-":"+",r=~~(Math.abs(t)/60),u=Math.abs(t)%60;return e+Pi(r,"0",2)+Pi(u,"0",2)}function co(n,t,e){pl.lastIndex=0;var r=pl.exec(t.substring(e,e+1));return r?e+r[0].length:-1}function lo(n){function t(n){try{Jc=zi;var t=new Jc;return t._=n,e(t)}finally{Jc=Date}}var e=ji(n);return t.parse=function(n){try{Jc=zi;var t=e.parse(n);return t&&t._}finally{Jc=Date}},t.toString=e.toString,t}function so(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=mo.bisect(bl,u);return i==bl.length?[t.year,ei(n.map(function(n){return n/31536e6}),e)[2]]:i?t[u/bl[i-1]<bl[i]/u?i-1:i]:[El,ei(n,e)[2]]}return r.invert=function(t){return ho(n.invert(t))},r.domain=function(t){return arguments.length?(n.domain(t),r):n.domain().map(ho)},r.nice=function(n,t){function e(e){return!isNaN(e)&&!n.range(e,ho(+e+1),t).length}var i=r.domain(),o=$u(i),a=null==n?u(o,10):"number"==typeof n&&u(o,n);return a&&(n=a[0],t=a[1]),r.domain(Ju(i,t>1?{floor:function(t){for(;e(t=n.floor(t));)t=ho(t-1);return t},ceil:function(t){for(;e(t=n.ceil(t));)t=ho(+t+1);return t}}:n))},r.ticks=function(n,t){var e=$u(r.domain()),i=null==n?u(e,10):"number"==typeof n?u(e,n):!n.range&&[{range:n},t];return i&&(n=i[0],t=i[1]),n.range(e[0],ho(+e[1]+1),1>t?1:t)},r.tickFormat=function(){return e},r.copy=function(){return fo(n.copy(),t,e)},ni(r,n)}function ho(n){return new Date(n)}function go(n){return function(t){for(var e=n.length-1,r=n[e];!r[1](t);)r=n[--e];return r[0](t)}}function po(n){return JSON.parse(n.responseText)}function vo(n){var t=xo.createRange();return t.selectNode(xo.body),t.createContextualFragment(n.responseText)}var mo={version:"3.3.6"};Date.now||(Date.now=function(){return+new Date});var yo=[].slice,Mo=function(n){return yo.call(n)},xo=document,bo=xo.documentElement,_o=window;try{Mo(bo.childNodes)[0].nodeType}catch(wo){Mo=function(n){for(var t=n.length,e=new Array(t);t--;)e[t]=n[t];return e}}try{xo.createElement("div").style.setProperty("opacity",0,"")}catch(So){var Eo=_o.Element.prototype,ko=Eo.setAttribute,Ao=Eo.setAttributeNS,No=_o.CSSStyleDeclaration.prototype,To=No.setProperty;Eo.setAttribute=function(n,t){ko.call(this,n,t+"")},Eo.setAttributeNS=function(n,t,e){Ao.call(this,n,t,e+"")},No.setProperty=function(n,t,e){To.call(this,n,t+"",e)}}mo.ascending=function(n,t){return t>n?-1:n>t?1:n>=t?0:0/0},mo.descending=function(n,t){return n>t?-1:t>n?1:t>=n?0:0/0},mo.min=function(n,t){var e,r,u=-1,i=n.length;if(1===arguments.length){for(;++u<i&&!(null!=(e=n[u])&&e>=e);)e=void 0;for(;++u<i;)null!=(r=n[u])&&e>r&&(e=r)}else{for(;++u<i&&!(null!=(e=t.call(n,n[u],u))&&e>=e);)e=void 0;for(;++u<i;)null!=(r=t.call(n,n[u],u))&&e>r&&(e=r)}return e},mo.max=function(n,t){var e,r,u=-1,i=n.length;if(1===arguments.length){for(;++u<i&&!(null!=(e=n[u])&&e>=e);)e=void 0;for(;++u<i;)null!=(r=n[u])&&r>e&&(e=r)}else{for(;++u<i&&!(null!=(e=t.call(n,n[u],u))&&e>=e);)e=void 0;for(;++u<i;)null!=(r=t.call(n,n[u],u))&&r>e&&(e=r)}return e},mo.extent=function(n,t){var e,r,u,i=-1,o=n.length;if(1===arguments.length){for(;++i<o&&!(null!=(e=u=n[i])&&e>=e);)e=u=void 0;for(;++i<o;)null!=(r=n[i])&&(e>r&&(e=r),r>u&&(u=r))}else{for(;++i<o&&!(null!=(e=u=t.call(n,n[i],i))&&e>=e);)e=void 0;for(;++i<o;)null!=(r=t.call(n,n[i],i))&&(e>r&&(e=r),r>u&&(u=r))}return[e,u]},mo.sum=function(n,t){var e,r=0,u=n.length,i=-1;if(1===arguments.length)for(;++i<u;)isNaN(e=+n[i])||(r+=e);else for(;++i<u;)isNaN(e=+t.call(n,n[i],i))||(r+=e);return r},mo.mean=function(t,e){var r,u=t.length,i=0,o=-1,a=0;if(1===arguments.length)for(;++o<u;)n(r=t[o])&&(i+=(r-i)/++a);else for(;++o<u;)n(r=e.call(t,t[o],o))&&(i+=(r-i)/++a);return a?i:void 0},mo.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},mo.median=function(t,e){return arguments.length>1&&(t=t.map(e)),t=t.filter(n),t.length?mo.quantile(t.sort(mo.ascending),.5):void 0},mo.bisector=function(n){return{left:function(t,e,r,u){for(arguments.length<3&&(r=0),arguments.length<4&&(u=t.length);u>r;){var i=r+u>>>1;n.call(t,t[i],i)<e?r=i+1:u=i}return r},right:function(t,e,r,u){for(arguments.length<3&&(r=0),arguments.length<4&&(u=t.length);u>r;){var i=r+u>>>1;e<n.call(t,t[i],i)?u=i:r=i+1}return r}}};var qo=mo.bisector(function(n){return n});mo.bisectLeft=qo.left,mo.bisect=mo.bisectRight=qo.right,mo.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},mo.permute=function(n,t){for(var e=t.length,r=new Array(e);e--;)r[e]=n[t[e]];return r},mo.pairs=function(n){for(var t,e=0,r=n.length-1,u=n[0],i=new Array(0>r?0:r);r>e;)i[e]=[t=u,u=n[++e]];return i},mo.zip=function(){if(!(u=arguments.length))return[];for(var n=-1,e=mo.min(arguments,t),r=new Array(e);++n<e;)for(var u,i=-1,o=r[n]=new Array(u);++i<u;)o[i]=arguments[i][n];return r},mo.transpose=function(n){return mo.zip.apply(mo,n)},mo.keys=function(n){var t=[];for(var e in n)t.push(e);return t},mo.values=function(n){var t=[];for(var e in n)t.push(n[e]);return t},mo.entries=function(n){var t=[];
    for(var e in n)t.push({key:e,value:n[e]});return t},mo.merge=function(n){return Array.prototype.concat.apply([],n)},mo.range=function(n,t,r){if(arguments.length<3&&(r=1,arguments.length<2&&(t=n,n=0)),1/0===(t-n)/r)throw new Error("infinite range");var u,i=[],o=e(Math.abs(r)),a=-1;if(n*=o,t*=o,r*=o,0>r)for(;(u=n+r*++a)>t;)i.push(u/o);else for(;(u=n+r*++a)<t;)i.push(u/o);return i},mo.map=function(n){var t=new u;if(n instanceof u)n.forEach(function(n,e){t.set(n,e)});else for(var e in n)t.set(e,n[e]);return t},r(u,{has:function(n){return zo+n in this},get:function(n){return this[zo+n]},set:function(n,t){return this[zo+n]=t},remove:function(n){return n=zo+n,n in this&&delete this[n]},keys:function(){var n=[];return this.forEach(function(t){n.push(t)}),n},values:function(){var n=[];return this.forEach(function(t,e){n.push(e)}),n},entries:function(){var n=[];return this.forEach(function(t,e){n.push({key:t,value:e})}),n},forEach:function(n){for(var t in this)t.charCodeAt(0)===Co&&n.call(this,t.substring(1),this[t])}});var zo="\x00",Co=zo.charCodeAt(0);mo.nest=function(){function n(t,a,c){if(c>=o.length)return r?r.call(i,a):e?a.sort(e):a;for(var l,s,f,h,g=-1,p=a.length,d=o[c++],v=new u;++g<p;)(h=v.get(l=d(s=a[g])))?h.push(s):v.set(l,[s]);return t?(s=t(),f=function(e,r){s.set(e,n(t,r,c))}):(s={},f=function(e,r){s[e]=n(t,r,c)}),v.forEach(f),s}function t(n,e){if(e>=o.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,i={},o=[],a=[];return i.map=function(t,e){return n(e,t,0)},i.entries=function(e){return t(n(mo.map,e,0),0)},i.key=function(n){return o.push(n),i},i.sortKeys=function(n){return a[o.length-1]=n,i},i.sortValues=function(n){return e=n,i},i.rollup=function(n){return r=n,i},i},mo.set=function(n){var t=new i;if(n)for(var e=0,r=n.length;r>e;++e)t.add(n[e]);return t},r(i,{has:function(n){return zo+n in this},add:function(n){return this[zo+n]=!0,n},remove:function(n){return n=zo+n,n in this&&delete this[n]},values:function(){var n=[];return this.forEach(function(t){n.push(t)}),n},forEach:function(n){for(var t in this)t.charCodeAt(0)===Co&&n.call(this,t.substring(1))}}),mo.behavior={},mo.rebind=function(n,t){for(var e,r=1,u=arguments.length;++r<u;)n[e=arguments[r]]=o(n,t,t[e]);return n};var Do=["webkit","ms","moz","Moz","o","O"];mo.dispatch=function(){for(var n=new l,t=-1,e=arguments.length;++t<e;)n[arguments[t]]=s(n);return n},l.prototype.on=function(n,t){var e=n.indexOf("."),r="";if(e>=0&&(r=n.substring(e+1),n=n.substring(0,e)),n)return arguments.length<2?this[n].on(r):this[n].on(r,t);if(2===arguments.length){if(null==t)for(n in this)this.hasOwnProperty(n)&&this[n].on(r,null);return this}},mo.event=null,mo.requote=function(n){return n.replace(jo,"\\$&")};var jo=/[\\\^\$\*\+\?\|\[\]\(\)\.\{\}]/g,Lo={}.__proto__?function(n,t){n.__proto__=t}:function(n,t){for(var e in t)n[e]=t[e]},Ho=function(n,t){return t.querySelector(n)},Fo=function(n,t){return t.querySelectorAll(n)},Po=bo[a(bo,"matchesSelector")],Oo=function(n,t){return Po.call(n,t)};"function"==typeof Sizzle&&(Ho=function(n,t){return Sizzle(n,t)[0]||null},Fo=function(n,t){return Sizzle.uniqueSort(Sizzle(n,t))},Oo=Sizzle.matchesSelector),mo.selection=function(){return Uo};var Ro=mo.selection.prototype=[];Ro.select=function(n){var t,e,r,u,i=[];n=d(n);for(var o=-1,a=this.length;++o<a;){i.push(t=[]),t.parentNode=(r=this[o]).parentNode;for(var c=-1,l=r.length;++c<l;)(u=r[c])?(t.push(e=n.call(u,u.__data__,c,o)),e&&"__data__"in u&&(e.__data__=u.__data__)):t.push(null)}return p(i)},Ro.selectAll=function(n){var t,e,r=[];n=v(n);for(var u=-1,i=this.length;++u<i;)for(var o=this[u],a=-1,c=o.length;++a<c;)(e=o[a])&&(r.push(t=Mo(n.call(e,e.__data__,a,u))),t.parentNode=e);return p(r)};var Yo={svg:"http://www.w3.org/2000/svg",xhtml:"http://www.w3.org/1999/xhtml",xlink:"http://www.w3.org/1999/xlink",xml:"http://www.w3.org/XML/1998/namespace",xmlns:"http://www.w3.org/2000/xmlns/"};mo.ns={prefix:Yo,qualify:function(n){var t=n.indexOf(":"),e=n;return t>=0&&(e=n.substring(0,t),n=n.substring(t+1)),Yo.hasOwnProperty(e)?{space:Yo[e],local:n}:n}},Ro.attr=function(n,t){if(arguments.length<2){if("string"==typeof n){var e=this.node();return n=mo.ns.qualify(n),n.local?e.getAttributeNS(n.space,n.local):e.getAttribute(n)}for(t in n)this.each(m(t,n[t]));return this}return this.each(m(n,t))},Ro.classed=function(n,t){if(arguments.length<2){if("string"==typeof n){var e=this.node(),r=(n=n.trim().split(/^|\s+/g)).length,u=-1;if(t=e.classList){for(;++u<r;)if(!t.contains(n[u]))return!1}else for(t=e.getAttribute("class");++u<r;)if(!M(n[u]).test(t))return!1;return!0}for(t in n)this.each(x(t,n[t]));return this}return this.each(x(n,t))},Ro.style=function(n,t,e){var r=arguments.length;if(3>r){if("string"!=typeof n){2>r&&(t="");for(e in n)this.each(_(e,n[e],t));return this}if(2>r)return _o.getComputedStyle(this.node(),null).getPropertyValue(n);e=""}return this.each(_(n,t,e))},Ro.property=function(n,t){if(arguments.length<2){if("string"==typeof n)return this.node()[n];for(t in n)this.each(w(t,n[t]));return this}return this.each(w(n,t))},Ro.text=function(n){return arguments.length?this.each("function"==typeof n?function(){var t=n.apply(this,arguments);this.textContent=null==t?"":t}:null==n?function(){this.textContent=""}:function(){this.textContent=n}):this.node().textContent},Ro.html=function(n){return arguments.length?this.each("function"==typeof n?function(){var t=n.apply(this,arguments);this.innerHTML=null==t?"":t}:null==n?function(){this.innerHTML=""}:function(){this.innerHTML=n}):this.node().innerHTML},Ro.append=function(n){return n=S(n),this.select(function(){return this.appendChild(n.apply(this,arguments))})},Ro.insert=function(n,t){return n=S(n),t=d(t),this.select(function(){return this.insertBefore(n.apply(this,arguments),t.apply(this,arguments))})},Ro.remove=function(){return this.each(function(){var n=this.parentNode;n&&n.removeChild(this)})},Ro.data=function(n,t){function e(n,e){var r,i,o,a=n.length,f=e.length,h=Math.min(a,f),g=new Array(f),p=new Array(f),d=new Array(a);if(t){var v,m=new u,y=new u,M=[];for(r=-1;++r<a;)v=t.call(i=n[r],i.__data__,r),m.has(v)?d[r]=i:m.set(v,i),M.push(v);for(r=-1;++r<f;)v=t.call(e,o=e[r],r),(i=m.get(v))?(g[r]=i,i.__data__=o):y.has(v)||(p[r]=E(o)),y.set(v,o),m.remove(v);for(r=-1;++r<a;)m.has(M[r])&&(d[r]=n[r])}else{for(r=-1;++r<h;)i=n[r],o=e[r],i?(i.__data__=o,g[r]=i):p[r]=E(o);for(;f>r;++r)p[r]=E(e[r]);for(;a>r;++r)d[r]=n[r]}p.update=g,p.parentNode=g.parentNode=d.parentNode=n.parentNode,c.push(p),l.push(g),s.push(d)}var r,i,o=-1,a=this.length;if(!arguments.length){for(n=new Array(a=(r=this[0]).length);++o<a;)(i=r[o])&&(n[o]=i.__data__);return n}var c=T([]),l=p([]),s=p([]);if("function"==typeof n)for(;++o<a;)e(r=this[o],n.call(r,r.parentNode.__data__,o));else for(;++o<a;)e(r=this[o],n);return l.enter=function(){return c},l.exit=function(){return s},l},Ro.datum=function(n){return arguments.length?this.property("__data__",n):this.property("__data__")},Ro.filter=function(n){var t,e,r,u=[];"function"!=typeof n&&(n=k(n));for(var i=0,o=this.length;o>i;i++){u.push(t=[]),t.parentNode=(e=this[i]).parentNode;for(var a=0,c=e.length;c>a;a++)(r=e[a])&&n.call(r,r.__data__,a)&&t.push(r)}return p(u)},Ro.order=function(){for(var n=-1,t=this.length;++n<t;)for(var e,r=this[n],u=r.length-1,i=r[u];--u>=0;)(e=r[u])&&(i&&i!==e.nextSibling&&i.parentNode.insertBefore(e,i),i=e);return this},Ro.sort=function(n){n=A.apply(this,arguments);for(var t=-1,e=this.length;++t<e;)this[t].sort(n);return this.order()},Ro.each=function(n){return N(this,function(t,e,r){n.call(t,t.__data__,e,r)})},Ro.call=function(n){var t=Mo(arguments);return n.apply(t[0]=this,t),this},Ro.empty=function(){return!this.node()},Ro.node=function(){for(var n=0,t=this.length;t>n;n++)for(var e=this[n],r=0,u=e.length;u>r;r++){var i=e[r];if(i)return i}return null},Ro.size=function(){var n=0;return this.each(function(){++n}),n};var Io=[];mo.selection.enter=T,mo.selection.enter.prototype=Io,Io.append=Ro.append,Io.empty=Ro.empty,Io.node=Ro.node,Io.call=Ro.call,Io.size=Ro.size,Io.select=function(n){for(var t,e,r,u,i,o=[],a=-1,c=this.length;++a<c;){r=(u=this[a]).update,o.push(t=[]),t.parentNode=u.parentNode;for(var l=-1,s=u.length;++l<s;)(i=u[l])?(t.push(r[l]=e=n.call(u.parentNode,i.__data__,l,a)),e.__data__=i.__data__):t.push(null)}return p(o)},Io.insert=function(n,t){return arguments.length<2&&(t=q(this)),Ro.insert.call(this,n,t)},Ro.transition=function(){for(var n,t,e=Oc||++Zc,r=[],u=Rc||{time:Date.now(),ease:Cr,delay:0,duration:250},i=-1,o=this.length;++i<o;){r.push(n=[]);for(var a=this[i],c=-1,l=a.length;++c<l;)(t=a[c])&&Ni(t,c,e,u),n.push(t)}return Ei(r,e)},Ro.interrupt=function(){return this.each(z)},mo.select=function(n){var t=["string"==typeof n?Ho(n,xo):n];return t.parentNode=bo,p([t])},mo.selectAll=function(n){var t=Mo("string"==typeof n?Fo(n,xo):n);return t.parentNode=bo,p([t])};var Uo=mo.select(bo);Ro.on=function(n,t,e){var r=arguments.length;if(3>r){if("string"!=typeof n){2>r&&(t=!1);for(e in n)this.each(C(e,n[e],t));return this}if(2>r)return(r=this.node()["__on"+n])&&r._;e=!1}return this.each(C(n,t,e))};var Zo=mo.map({mouseenter:"mouseover",mouseleave:"mouseout"});Zo.forEach(function(n){"on"+n in xo&&Zo.remove(n)});var Vo=a(bo.style,"userSelect"),Xo=0;mo.mouse=function(n){return H(n,h())};var $o=/WebKit/.test(_o.navigator.userAgent)?-1:0;mo.touches=function(n,t){return arguments.length<2&&(t=h().touches),t?Mo(t).map(function(t){var e=H(n,t);return e.identifier=t.identifier,e}):[]},mo.behavior.drag=function(){function n(){this.on("mousedown.drag",o).on("touchstart.drag",a)}function t(){return mo.event.changedTouches[0].identifier}function e(n,t){return mo.touches(n).filter(function(n){return n.identifier===t})[0]}function r(n,t,e,r){return function(){function o(){var n=t(s,g),e=n[0]-d[0],r=n[1]-d[1];v|=e|r,d=n,f({type:"drag",x:n[0]+c[0],y:n[1]+c[1],dx:e,dy:r})}function a(){m.on(e+"."+p,null).on(r+"."+p,null),y(v&&mo.event.target===h),f({type:"dragend"})}var c,l=this,s=l.parentNode,f=u.of(l,arguments),h=mo.event.target,g=n(),p=null==g?"drag":"drag-"+g,d=t(s,g),v=0,m=mo.select(_o).on(e+"."+p,o).on(r+"."+p,a),y=L();i?(c=i.apply(l,arguments),c=[c.x-d[0],c.y-d[1]]):c=[0,0],f({type:"dragstart"})}}var u=g(n,"drag","dragstart","dragend"),i=null,o=r(c,mo.mouse,"mousemove","mouseup"),a=r(t,e,"touchmove","touchend");return n.origin=function(t){return arguments.length?(i=t,n):i},mo.rebind(n,u,"on")};var Bo=Math.PI,Wo=2*Bo,Jo=Bo/2,Go=1e-6,Ko=Go*Go,Qo=Bo/180,na=180/Bo,ta=Math.SQRT2,ea=2,ra=4;mo.interpolateZoom=function(n,t){function e(n){var t=n*y;if(m){var e=Y(d),o=i/(ea*h)*(e*I(ta*t+d)-R(d));return[r+o*l,u+o*s,i*e/Y(ta*t+d)]}return[r+n*l,u+n*s,i*Math.exp(ta*t)]}var r=n[0],u=n[1],i=n[2],o=t[0],a=t[1],c=t[2],l=o-r,s=a-u,f=l*l+s*s,h=Math.sqrt(f),g=(c*c-i*i+ra*f)/(2*i*ea*h),p=(c*c-i*i-ra*f)/(2*c*ea*h),d=Math.log(Math.sqrt(g*g+1)-g),v=Math.log(Math.sqrt(p*p+1)-p),m=v-d,y=(m||Math.log(c/i))/ta;return e.duration=1e3*y,e},mo.behavior.zoom=function(){function n(n){n.on(A,l).on(oa+".zoom",h).on(N,p).on("dblclick.zoom",d).on(q,s)}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(k[0],Math.min(k[1],n))}function u(n,t){t=e(t),S.x+=n[0]-t[0],S.y+=n[1]-t[1]}function i(){b&&b.domain(x.range().map(function(n){return(n-S.x)/S.k}).map(x.invert)),w&&w.domain(_.range().map(function(n){return(n-S.y)/S.k}).map(_.invert))}function o(n){n({type:"zoomstart"})}function a(n){i(),n({type:"zoom",scale:S.k,translate:[S.x,S.y]})}function c(n){n({type:"zoomend"})}function l(){function n(){s=1,u(mo.mouse(r),h),a(i)}function e(){f.on(N,_o===r?p:null).on(T,null),g(s&&mo.event.target===l),c(i)}var r=this,i=C.of(r,arguments),l=mo.event.target,s=0,f=mo.select(_o).on(N,n).on(T,e),h=t(mo.mouse(r)),g=L();z.call(r),o(i)}function s(){function n(){var n=mo.touches(p);return g=S.k,n.forEach(function(n){n.identifier in v&&(v[n.identifier]=t(n))}),n}function e(){for(var t=mo.event.changedTouches,e=0,i=t.length;i>e;++e)v[t[e].identifier]=null;var o=n(),c=Date.now();if(1===o.length){if(500>c-M){var l=o[0],s=v[l.identifier];r(2*S.k),u(l,s),f(),a(d)}M=c}else if(o.length>1){var l=o[0],h=o[1],g=l[0]-h[0],p=l[1]-h[1];m=g*g+p*p}}function i(){for(var n,t,e,i,o=mo.touches(p),c=0,l=o.length;l>c;++c,i=null)if(e=o[c],i=v[e.identifier]){if(t)break;n=e,t=i}if(i){var s=(s=e[0]-n[0])*s+(s=e[1]-n[1])*s,f=m&&Math.sqrt(s/m);n=[(n[0]+e[0])/2,(n[1]+e[1])/2],t=[(t[0]+i[0])/2,(t[1]+i[1])/2],r(f*g)}M=null,u(n,t),a(d)}function h(){if(mo.event.touches.length){for(var t=mo.event.changedTouches,e=0,r=t.length;r>e;++e)delete v[t[e].identifier];for(var u in v)return void n()}_.on(x,null).on(b,null),w.on(A,l).on(q,s),E(),c(d)}var g,p=this,d=C.of(p,arguments),v={},m=0,y=mo.event.changedTouches[0].identifier,x="touchmove.zoom-"+y,b="touchend.zoom-"+y,_=mo.select(_o).on(x,i).on(b,h),w=mo.select(p).on(A,null).on(q,e),E=L();z.call(p),e(),o(d)}function h(){var n=C.of(this,arguments);y?clearTimeout(y):(z.call(this),o(n)),y=setTimeout(function(){y=null,c(n)},50),f();var e=m||mo.mouse(this);v||(v=t(e)),r(Math.pow(2,.002*ua())*S.k),u(e,v),a(n)}function p(){v=null}function d(){var n=C.of(this,arguments),e=mo.mouse(this),i=t(e),l=Math.log(S.k)/Math.LN2;o(n),r(Math.pow(2,mo.event.shiftKey?Math.ceil(l)-1:Math.floor(l)+1)),u(e,i),a(n),c(n)}var v,m,y,M,x,b,_,w,S={x:0,y:0,k:1},E=[960,500],k=ia,A="mousedown.zoom",N="mousemove.zoom",T="mouseup.zoom",q="touchstart.zoom",C=g(n,"zoomstart","zoom","zoomend");return n.event=function(n){n.each(function(){var n=C.of(this,arguments),t=S;Oc?mo.select(this).transition().each("start.zoom",function(){S=this.__chart__||{x:0,y:0,k:1},o(n)}).tween("zoom:zoom",function(){var e=E[0],r=E[1],u=e/2,i=r/2,o=mo.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("end.zoom",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?(k=null==t?ia:[+t[0],+t[1]],n):k},n.center=function(t){return arguments.length?(m=t&&[+t[0],+t[1]],n):m},n.size=function(t){return arguments.length?(E=t&&[+t[0],+t[1]],n):E},n.x=function(t){return arguments.length?(b=t,x=t.copy(),S={x:0,y:0,k:1},n):b},n.y=function(t){return arguments.length?(w=t,_=t.copy(),S={x:0,y:0,k:1},n):w},mo.rebind(n,C,"on")};var ua,ia=[0,1/0],oa="onwheel"in xo?(ua=function(){return-mo.event.deltaY*(mo.event.deltaMode?120:1)},"wheel"):"onmousewheel"in xo?(ua=function(){return mo.event.wheelDelta},"mousewheel"):(ua=function(){return-mo.event.detail},"MozMousePixelScroll");Z.prototype.toString=function(){return this.rgb()+""},mo.hsl=function(n,t,e){return 1===arguments.length?n instanceof X?V(n.h,n.s,n.l):lt(""+n,st,V):V(+n,+t,+e)};var aa=X.prototype=new Z;aa.brighter=function(n){return n=Math.pow(.7,arguments.length?n:1),V(this.h,this.s,this.l/n)},aa.darker=function(n){return n=Math.pow(.7,arguments.length?n:1),V(this.h,this.s,n*this.l)},aa.rgb=function(){return $(this.h,this.s,this.l)},mo.hcl=function(n,t,e){return 1===arguments.length?n instanceof W?B(n.h,n.c,n.l):n instanceof K?nt(n.l,n.a,n.b):nt((n=ft((n=mo.rgb(n)).r,n.g,n.b)).l,n.a,n.b):B(+n,+t,+e)};var ca=W.prototype=new Z;ca.brighter=function(n){return B(this.h,this.c,Math.min(100,this.l+la*(arguments.length?n:1)))},ca.darker=function(n){return B(this.h,this.c,Math.max(0,this.l-la*(arguments.length?n:1)))},ca.rgb=function(){return J(this.h,this.c,this.l).rgb()},mo.lab=function(n,t,e){return 1===arguments.length?n instanceof K?G(n.l,n.a,n.b):n instanceof W?J(n.l,n.c,n.h):ft((n=mo.rgb(n)).r,n.g,n.b):G(+n,+t,+e)};var la=18,sa=.95047,fa=1,ha=1.08883,ga=K.prototype=new Z;ga.brighter=function(n){return G(Math.min(100,this.l+la*(arguments.length?n:1)),this.a,this.b)},ga.darker=function(n){return G(Math.max(0,this.l-la*(arguments.length?n:1)),this.a,this.b)},ga.rgb=function(){return Q(this.l,this.a,this.b)},mo.rgb=function(n,t,e){return 1===arguments.length?n instanceof at?ot(n.r,n.g,n.b):lt(""+n,ot,$):ot(~~n,~~t,~~e)};var pa=at.prototype=new Z;pa.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&&u>t&&(t=u),e&&u>e&&(e=u),r&&u>r&&(r=u),ot(Math.min(255,~~(t/n)),Math.min(255,~~(e/n)),Math.min(255,~~(r/n)))):ot(u,u,u)},pa.darker=function(n){return n=Math.pow(.7,arguments.length?n:1),ot(~~(n*this.r),~~(n*this.g),~~(n*this.b))},pa.hsl=function(){return st(this.r,this.g,this.b)},pa.toString=function(){return"#"+ct(this.r)+ct(this.g)+ct(this.b)};var da=mo.map({aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,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,lemonchiffon: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:14524637,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});da.forEach(function(n,t){da.set(n,ut(t))}),mo.functor=pt,mo.xhr=vt(dt),mo.dsv=function(n,t){function e(n,e,i){arguments.length<3&&(i=e,e=null);var o=mo.xhr(n,t,i);return o.row=function(n){return arguments.length?o.response(null==(e=n)?r:u(n)):e},o.row(e)}function r(n){return e.parse(n.responseText)}function u(n){return function(t){return e.parse(t.responseText,n)}}function o(t){return t.map(a).join(n)}function a(n){return c.test(n)?'"'+n.replace(/\"/g,'""')+'"':n}var c=new RegExp('["'+n+"\n]"),l=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("d","return {"+n.map(function(n,t){return JSON.stringify(n)+": d["+t+"]"}).join(",")+"}");r=t?function(n,e){return t(u(n),e)}:u})},e.parseRows=function(n,t){function e(){if(s>=c)return o;if(u)return u=!1,i;var t=s;if(34===n.charCodeAt(t)){for(var e=t;e++<c;)if(34===n.charCodeAt(e)){if(34!==n.charCodeAt(e+1))break;++e}s=e+2;var r=n.charCodeAt(e+1);return 13===r?(u=!0,10===n.charCodeAt(e+2)&&++s):10===r&&(u=!0),n.substring(t+1,e).replace(/""/g,'"')}for(;c>s;){var r=n.charCodeAt(s++),a=1;if(10===r)u=!0;else if(13===r)u=!0,10===n.charCodeAt(s)&&(++s,++a);else if(r!==l)continue;return n.substring(t,s-a)}return n.substring(t)}for(var r,u,i={},o={},a=[],c=n.length,s=0,f=0;(r=e())!==o;){for(var h=[];r!==i&&r!==o;)h.push(r),r=e();(!t||(h=t(h,f++)))&&a.push(h)}return a},e.format=function(t){if(Array.isArray(t[0]))return e.formatRows(t);var r=new i,u=[];return t.forEach(function(n){for(var t in n)r.has(t)||u.push(r.add(t))}),[u.map(a).join(n)].concat(t.map(function(t){return u.map(function(n){return a(t[n])}).join(n)})).join("\n")},e.formatRows=function(n){return n.map(o).join("\n")},e},mo.csv=mo.dsv(",","text/csv"),mo.tsv=mo.dsv("	","text/tab-separated-values");var va,ma,ya,Ma,xa,ba=_o[a(_o,"requestAnimationFrame")]||function(n){setTimeout(n,17)};mo.timer=function(n,t,e){var r=arguments.length;2>r&&(t=0),3>r&&(e=Date.now());var u=e+t,i={callback:n,time:u,next:null};ma?ma.next=i:va=i,ma=i,ya||(Ma=clearTimeout(Ma),ya=1,ba(Mt))},mo.timer.flush=function(){bt(),_t()};var _a=".",wa=",",Sa=[3,3],Ea="$",ka=["y","z","a","f","p","n","\xb5","m","","k","M","G","T","P","E","Z","Y"].map(wt);mo.formatPrefix=function(n,t){var e=0;return n&&(0>n&&(n*=-1),t&&(n=mo.round(n,St(n,t))),e=1+Math.floor(1e-12+Math.log(n)/Math.LN10),e=Math.max(-24,Math.min(24,3*Math.floor((0>=e?e+1:e-1)/3)))),ka[8+e/3]},mo.round=function(n,t){return t?Math.round(n*(t=Math.pow(10,t)))/t:Math.round(n)},mo.format=function(n){var t=Aa.exec(n),e=t[1]||" ",r=t[2]||">",u=t[3]||"",i=t[4]||"",o=t[5],a=+t[6],c=t[7],l=t[8],s=t[9],f=1,h="",g=!1;switch(l&&(l=+l.substring(1)),(o||"0"===e&&"="===r)&&(o=e="0",r="=",c&&(a-=Math.floor((a-1)/4))),s){case"n":c=!0,s="g";break;case"%":f=100,h="%",s="f";break;case"p":f=100,h="%",s="r";break;case"b":case"o":case"x":case"X":"#"===i&&(i="0"+s.toLowerCase());case"c":case"d":g=!0,l=0;break;case"s":f=-1,s="r"}"#"===i?i="":"$"===i&&(i=Ea),"r"!=s||l||(s="g"),null!=l&&("g"==s?l=Math.max(1,Math.min(21,l)):("e"==s||"f"==s)&&(l=Math.max(0,Math.min(20,l)))),s=Na.get(s)||Et;var p=o&&c;return function(n){if(g&&n%1)return"";var t=0>n||0===n&&0>1/n?(n=-n,"-"):u;if(0>f){var d=mo.formatPrefix(n,l);n=d.scale(n),h=d.symbol}else n*=f;n=s(n,l);var v=n.lastIndexOf("."),m=0>v?n:n.substring(0,v),y=0>v?"":_a+n.substring(v+1);!o&&c&&(m=Ta(m));var M=i.length+m.length+y.length+(p?0:t.length),x=a>M?new Array(M=a-M+1).join(e):"";return p&&(m=Ta(x+m)),t+=i,n=m+y,("<"===r?t+n+x:">"===r?x+t+n:"^"===r?x.substring(0,M>>=1)+t+n+x.substring(M):t+(p?n:x+n))+h}};var Aa=/(?:([^{])?([<>=^]))?([+\- ])?([$#])?(0)?(\d+)?(,)?(\.-?\d+)?([a-z%])?/i,Na=mo.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:function(n,t){return n.toExponential(t)},f:function(n,t){return n.toFixed(t)},r:function(n,t){return(n=mo.round(n,St(n,t))).toFixed(Math.max(0,Math.min(20,St(n*(1+1e-15),t))))}}),Ta=dt;if(Sa){var qa=Sa.length;Ta=function(n){for(var t=n.length,e=[],r=0,u=Sa[0];t>0&&u>0;)e.push(n.substring(t-=u,t+u)),u=Sa[r=(r+1)%qa];return e.reverse().join(wa)}}mo.geo={},kt.prototype={s:0,t:0,add:function(n){At(n,this.t,za),At(za.s,this.s,this),this.s?this.t+=za.t:this.s=za.t},reset:function(){this.s=this.t=0},valueOf:function(){return this.s}};var za=new kt;mo.geo.stream=function(n,t){n&&Ca.hasOwnProperty(n.type)?Ca[n.type](n,t):Nt(n,t)};var Ca={Feature:function(n,t){Nt(n.geometry,t)},FeatureCollection:function(n,t){for(var e=n.features,r=-1,u=e.length;++r<u;)Nt(e[r].geometry,t)}},Da={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<u;)n=e[r],t.point(n[0],n[1],n[2])},LineString:function(n,t){Tt(n.coordinates,t,0)},MultiLineString:function(n,t){for(var e=n.coordinates,r=-1,u=e.length;++r<u;)Tt(e[r],t,0)},Polygon:function(n,t){qt(n.coordinates,t)},MultiPolygon:function(n,t){for(var e=n.coordinates,r=-1,u=e.length;++r<u;)qt(e[r],t)},GeometryCollection:function(n,t){for(var e=n.geometries,r=-1,u=e.length;++r<u;)Nt(e[r],t)}};mo.geo.area=function(n){return ja=0,mo.geo.stream(n,Ha),ja};var ja,La=new kt,Ha={sphere:function(){ja+=4*Bo},point:c,lineStart:c,lineEnd:c,polygonStart:function(){La.reset(),Ha.lineStart=zt},polygonEnd:function(){var n=2*La;ja+=0>n?4*Bo+n:n,Ha.lineStart=Ha.lineEnd=Ha.point=c}};mo.geo.bounds=function(){function n(n,t){M.push(x=[s=n,h=n]),f>t&&(f=t),t>g&&(g=t)}function t(t,e){var r=Ct([t*Qo,e*Qo]);if(m){var u=jt(m,r),i=[u[1],-u[0],0],o=jt(i,u);Ft(o),o=Pt(o);var c=t-p,l=c>0?1:-1,d=o[0]*na*l,v=Math.abs(c)>180;if(v^(d>l*p&&l*t>d)){var y=o[1]*na;y>g&&(g=y)}else if(d=(d+360)%360-180,v^(d>l*p&&l*t>d)){var y=-o[1]*na;f>y&&(f=y)}else f>e&&(f=e),e>g&&(g=e);v?p>t?a(s,t)>a(s,h)&&(h=t):a(t,h)>a(s,h)&&(s=t):h>=s?(s>t&&(s=t),t>h&&(h=t)):t>p?a(s,t)>a(s,h)&&(h=t):a(t,h)>a(s,h)&&(s=t)}else n(t,e);m=r,p=t}function e(){b.point=t}function r(){x[0]=s,x[1]=h,b.point=n,m=null}function u(n,e){if(m){var r=n-p;y+=Math.abs(r)>180?r+(r>0?360:-360):r}else d=n,v=e;Ha.point(n,e),t(n,e)}function i(){Ha.lineStart()}function o(){u(d,v),Ha.lineEnd(),Math.abs(y)>Go&&(s=-(h=180)),x[0]=s,x[1]=h,m=null}function a(n,t){return(t-=n)<0?t+360:t}function c(n,t){return n[0]-t[0]}function l(n,t){return t[0]<=t[1]?t[0]<=n&&n<=t[1]:n<t[0]||t[1]<n}var s,f,h,g,p,d,v,m,y,M,x,b={point:n,lineStart:e,lineEnd:r,polygonStart:function(){b.point=u,b.lineStart=i,b.lineEnd=o,y=0,Ha.polygonStart()},polygonEnd:function(){Ha.polygonEnd(),b.point=n,b.lineStart=e,b.lineEnd=r,0>La?(s=-(h=180),f=-(g=90)):y>Go?g=90:-Go>y&&(f=-90),x[0]=s,x[1]=h}};return function(n){g=h=-(s=f=1/0),M=[],mo.geo.stream(n,b);var t=M.length;if(t){M.sort(c);for(var e,r=1,u=M[0],i=[u];t>r;++r)e=M[r],l(e[0],u)||l(e[1],u)?(a(u[0],e[1])>a(u[0],u[1])&&(u[1]=e[1]),a(e[0],u[1])>a(u[0],u[1])&&(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>=r;u=e,++r)e=i[r],(o=a(u[1],e[0]))>p&&(p=o,s=e[0],h=u[1])}return M=x=null,1/0===s||1/0===f?[[0/0,0/0],[0/0,0/0]]:[[s,f],[h,g]]}}(),mo.geo.centroid=function(n){Fa=Pa=Oa=Ra=Ya=Ia=Ua=Za=Va=Xa=$a=0,mo.geo.stream(n,Ba);var t=Va,e=Xa,r=$a,u=t*t+e*e+r*r;return Ko>u&&(t=Ia,e=Ua,r=Za,Go>Pa&&(t=Oa,e=Ra,r=Ya),u=t*t+e*e+r*r,Ko>u)?[0/0,0/0]:[Math.atan2(e,t)*na,O(r/Math.sqrt(u))*na]};var Fa,Pa,Oa,Ra,Ya,Ia,Ua,Za,Va,Xa,$a,Ba={sphere:c,point:Rt,lineStart:It,lineEnd:Ut,polygonStart:function(){Ba.lineStart=Zt},polygonEnd:function(){Ba.lineStart=It}},Wa=Bt(Vt,Qt,te,[-Bo,-Bo/2]),Ja=1e9;mo.geo.clipExtent=function(){var n,t,e,r,u,i,o={stream:function(n){return u&&(u.valid=!1),u=i(n),u.valid=!0,u},extent:function(a){return arguments.length?(i=re(n=+a[0][0],t=+a[0][1],e=+a[1][0],r=+a[1][1]),u&&(u.valid=!1,u=null),o):[[n,t],[e,r]]}};return o.extent([[0,0],[960,500]])},(mo.geo.conicEqualArea=function(){return oe(ae)}).raw=ae,mo.geo.albers=function(){return mo.geo.conicEqualArea().rotate([96,0]).center([-.6,38.7]).parallels([29.5,45.5]).scale(1070)},mo.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=mo.geo.albers(),o=mo.geo.conicEqualArea().rotate([154,0]).center([-2,58.5]).parallels([55,65]),a=mo.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>=.12&&.234>u&&r>=-.425&&-.214>r?o:u>=.166&&.234>u&&r>=-.214&&-.115>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 l=i.scale(),s=+t[0],f=+t[1];return e=i.translate(t).clipExtent([[s-.455*l,f-.238*l],[s+.455*l,f+.238*l]]).stream(c).point,r=o.translate([s-.307*l,f+.201*l]).clipExtent([[s-.425*l+Go,f+.12*l+Go],[s-.214*l-Go,f+.234*l-Go]]).stream(c).point,u=a.translate([s-.205*l,f+.212*l]).clipExtent([[s-.214*l+Go,f+.166*l+Go],[s-.115*l-Go,f+.234*l-Go]]).stream(c).point,n},n.scale(1070)};var Ga,Ka,Qa,nc,tc,ec,rc={point:c,lineStart:c,lineEnd:c,polygonStart:function(){Ka=0,rc.lineStart=ce},polygonEnd:function(){rc.lineStart=rc.lineEnd=rc.point=c,Ga+=Math.abs(Ka/2)}},uc={point:le,lineStart:c,lineEnd:c,polygonStart:c,polygonEnd:c},ic={point:he,lineStart:ge,lineEnd:pe,polygonStart:function(){ic.lineStart=de},polygonEnd:function(){ic.point=he,ic.lineStart=ge,ic.lineEnd=pe}};mo.geo.transform=function(n){return{stream:function(t){var e=new ye(t);for(var r in n)e[r]=n[r];return e}}},ye.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()}},mo.geo.path=function(){function n(n){return n&&("function"==typeof a&&i.pointRadius(+a.apply(this,arguments)),o&&o.valid||(o=u(i)),mo.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 Ga=0,mo.geo.stream(n,u(rc)),Ga},n.centroid=function(n){return Oa=Ra=Ya=Ia=Ua=Za=Va=Xa=$a=0,mo.geo.stream(n,u(ic)),$a?[Va/$a,Xa/$a]:Za?[Ia/Za,Ua/Za]:Ya?[Oa/Ya,Ra/Ya]:[0/0,0/0]},n.bounds=function(n){return tc=ec=-(Qa=nc=1/0),mo.geo.stream(n,u(uc)),[[Qa,nc],[tc,ec]]},n.projection=function(n){return arguments.length?(u=(e=n)?n.stream||Me(n):dt,t()):e},n.context=function(n){return arguments.length?(i=null==(r=n)?new se:new ve(n),"function"!=typeof a&&i.pointRadius(a),t()):r},n.pointRadius=function(t){return arguments.length?(a="function"==typeof t?t:(i.pointRadius(+t),+t),n):a},n.projection(mo.geo.albersUsa()).context(null)},mo.geo.projection=xe,mo.geo.projectionMutator=be,(mo.geo.equirectangular=function(){return xe(we)}).raw=we.invert=we,mo.geo.rotation=function(n){function t(t){return t=n(t[0]*Qo,t[1]*Qo),t[0]*=na,t[1]*=na,t}return n=Ee(n[0]%360*Qo,n[1]*Qo,n.length>2?n[2]*Qo:0),t.invert=function(t){return t=n.invert(t[0]*Qo,t[1]*Qo),t[0]*=na,t[1]*=na,t},t},Se.invert=we,mo.geo.circle=function(){function n(){var n="function"==typeof r?r.apply(this,arguments):r,t=Ee(-n[0]*Qo,-n[1]*Qo,0).invert,u=[];return e(null,null,1,{point:function(n,e){u.push(n=t(n,e)),n[0]*=na,n[1]*=na}}),{type:"Polygon",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=Te((t=+r)*Qo,u*Qo),n):t},n.precision=function(r){return arguments.length?(e=Te(t*Qo,(u=+r)*Qo),n):u},n.angle(90)},mo.geo.distance=function(n,t){var e,r=(t[0]-n[0])*Qo,u=n[1]*Qo,i=t[1]*Qo,o=Math.sin(r),a=Math.cos(r),c=Math.sin(u),l=Math.cos(u),s=Math.sin(i),f=Math.cos(i);return Math.atan2(Math.sqrt((e=f*o)*e+(e=l*s-c*f*a)*e),c*s+l*f*a)},mo.geo.graticule=function(){function n(){return{type:"MultiLineString",coordinates:t()}}function t(){return mo.range(Math.ceil(i/v)*v,u,v).map(h).concat(mo.range(Math.ceil(l/m)*m,c,m).map(g)).concat(mo.range(Math.ceil(r/p)*p,e,p).filter(function(n){return Math.abs(n%v)>Go
    }).map(s)).concat(mo.range(Math.ceil(a/d)*d,o,d).filter(function(n){return Math.abs(n%m)>Go}).map(f))}var e,r,u,i,o,a,c,l,s,f,h,g,p=10,d=p,v=90,m=360,y=2.5;return n.lines=function(){return t().map(function(n){return{type:"LineString",coordinates:n}})},n.outline=function(){return{type:"Polygon",coordinates:[h(i).concat(g(c).slice(1),h(u).reverse().slice(1),g(l).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],l=+t[0][1],c=+t[1][1],i>u&&(t=i,i=u,u=t),l>c&&(t=l,l=c,c=t),n.precision(y)):[[i,l],[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>e&&(t=r,r=e,e=t),a>o&&(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.length?(v=+t[0],m=+t[1],n):[v,m]},n.minorStep=function(t){return arguments.length?(p=+t[0],d=+t[1],n):[p,d]},n.precision=function(t){return arguments.length?(y=+t,s=ze(a,o,90),f=Ce(r,e,y),h=ze(l,c,90),g=Ce(i,u,y),n):y},n.majorExtent([[-180,-90+Go],[180,90-Go]]).minorExtent([[-180,-80-Go],[180,80+Go]])},mo.geo.greatArc=function(){function n(){return{type:"LineString",coordinates:[t||r.apply(this,arguments),e||u.apply(this,arguments)]}}var t,e,r=De,u=je;return n.distance=function(){return mo.geo.distance(t||r.apply(this,arguments),e||u.apply(this,arguments))},n.source=function(e){return arguments.length?(r=e,t="function"==typeof e?null:e,n):r},n.target=function(t){return arguments.length?(u=t,e="function"==typeof t?null:t,n):u},n.precision=function(){return arguments.length?n:0},n},mo.geo.interpolate=function(n,t){return Le(n[0]*Qo,n[1]*Qo,t[0]*Qo,t[1]*Qo)},mo.geo.length=function(n){return oc=0,mo.geo.stream(n,ac),oc};var oc,ac={sphere:c,point:c,lineStart:He,lineEnd:c,polygonStart:c,polygonEnd:c},cc=Fe(function(n){return Math.sqrt(2/(1+n))},function(n){return 2*Math.asin(n/2)});(mo.geo.azimuthalEqualArea=function(){return xe(cc)}).raw=cc;var lc=Fe(function(n){var t=Math.acos(n);return t&&t/Math.sin(t)},dt);(mo.geo.azimuthalEquidistant=function(){return xe(lc)}).raw=lc,(mo.geo.conicConformal=function(){return oe(Pe)}).raw=Pe,(mo.geo.conicEquidistant=function(){return oe(Oe)}).raw=Oe;var sc=Fe(function(n){return 1/n},Math.atan);(mo.geo.gnomonic=function(){return xe(sc)}).raw=sc,Re.invert=function(n,t){return[n,2*Math.atan(Math.exp(t))-Jo]},(mo.geo.mercator=function(){return Ye(Re)}).raw=Re;var fc=Fe(function(){return 1},Math.asin);(mo.geo.orthographic=function(){return xe(fc)}).raw=fc;var hc=Fe(function(n){return 1/(1+n)},function(n){return 2*Math.atan(n)});(mo.geo.stereographic=function(){return xe(hc)}).raw=hc,Ie.invert=function(n,t){return[Math.atan2(R(n),Math.cos(t)),O(Math.sin(t)/Y(n))]},(mo.geo.transverseMercator=function(){return Ye(Ie)}).raw=Ie,mo.geom={},mo.svg={},mo.svg.line=function(){return Ue(dt)};var gc=mo.map({linear:Xe,"linear-closed":$e,step:Be,"step-before":We,"step-after":Je,basis:er,"basis-open":rr,"basis-closed":ur,bundle:ir,cardinal:Qe,"cardinal-open":Ge,"cardinal-closed":Ke,monotone:fr});gc.forEach(function(n,t){t.key=n,t.closed=/-closed$/.test(n)});var pc=[0,2/3,1/3,0],dc=[0,1/3,2/3,0],vc=[0,1/6,2/3,1/6];mo.geom.hull=function(n){function t(n){if(n.length<3)return[];var t,u,i,o,a,c,l,s,f,h,g,p,d=pt(e),v=pt(r),m=n.length,y=m-1,M=[],x=[],b=0;if(d===Ze&&r===Ve)t=n;else for(i=0,t=[];m>i;++i)t.push([+d.call(this,u=n[i],i),+v.call(this,u,i)]);for(i=1;m>i;++i)(t[i][1]<t[b][1]||t[i][1]==t[b][1]&&t[i][0]<t[b][0])&&(b=i);for(i=0;m>i;++i)i!==b&&(c=t[i][1]-t[b][1],a=t[i][0]-t[b][0],M.push({angle:Math.atan2(c,a),index:i}));for(M.sort(function(n,t){return n.angle-t.angle}),g=M[0].angle,h=M[0].index,f=0,i=1;y>i;++i){if(o=M[i].index,g==M[i].angle){if(a=t[h][0]-t[b][0],c=t[h][1]-t[b][1],l=t[o][0]-t[b][0],s=t[o][1]-t[b][1],a*a+c*c>=l*l+s*s){M[i].index=-1;continue}M[f].index=-1}g=M[i].angle,f=i,h=o}for(x.push(b),i=0,o=0;2>i;++o)M[o].index>-1&&(x.push(M[o].index),i++);for(p=x.length;y>o;++o)if(!(M[o].index<0)){for(;!hr(x[p-2],x[p-1],M[o].index,t);)--p;x[p++]=M[o].index}var _=[];for(i=p-1;i>=0;--i)_.push(n[x[i]]);return _}var e=Ze,r=Ve;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)},mo.geom.polygon=function(n){return Lo(n,mc),n};var mc=mo.geom.polygon.prototype=[];mc.area=function(){for(var n,t=-1,e=this.length,r=this[e-1],u=0;++t<e;)n=r,r=this[t],u+=n[1]*r[0]-n[0]*r[1];return.5*u},mc.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<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]},mc.clip=function(n){for(var t,e,r,u,i,o,a=dr(n),c=-1,l=this.length-dr(this),s=this[l-1];++c<l;){for(t=n.slice(),n.length=0,u=this[c],i=t[(r=t.length-a)-1],e=-1;++e<r;)o=t[e],gr(o,s,u)?(gr(i,s,u)||n.push(pr(i,o,s,u)),n.push(o)):gr(i,s,u)&&n.push(pr(i,o,s,u)),i=o;a&&n.push(n[0]),s=u}return n},mo.geom.delaunay=function(n){var t=n.map(function(){return[]}),e=[];return vr(n,function(e){t[e.region.l.index].push(n[e.region.r.index])}),t.forEach(function(t,r){var u=n[r],i=u[0],o=u[1];t.forEach(function(n){n.angle=Math.atan2(n[0]-i,n[1]-o)}),t.sort(function(n,t){return n.angle-t.angle});for(var a=0,c=t.length-1;c>a;a++)e.push([u,t[a],t[a+1]])}),e},mo.geom.voronoi=function(n){function t(n){var t,i,o,a=n.map(function(){return[]}),c=pt(e),l=pt(r),s=n.length,f=1e6;if(c===Ze&&l===Ve)t=n;else for(t=new Array(s),o=0;s>o;++o)t[o]=[+c.call(this,i=n[o],o),+l.call(this,i,o)];if(vr(t,function(n){var t,e,r,u,i,o;1===n.a&&n.b>=0?(t=n.ep.r,e=n.ep.l):(t=n.ep.l,e=n.ep.r),1===n.a?(i=t?t.y:-f,r=n.c-n.b*i,o=e?e.y:f,u=n.c-n.b*o):(r=t?t.x:-f,i=n.c-n.a*r,u=e?e.x:f,o=n.c-n.a*u);var c=[r,i],l=[u,o];a[n.region.l.index].push(c,l),a[n.region.r.index].push(c,l)}),a=a.map(function(n,e){var r=t[e][0],u=t[e][1],i=n.map(function(n){return Math.atan2(n[0]-r,n[1]-u)}),o=mo.range(n.length).sort(function(n,t){return i[n]-i[t]});return o.filter(function(n,t){return!t||i[n]-i[o[t-1]]>Go}).map(function(t){return n[t]})}),a.forEach(function(n,e){var r=n.length;if(!r)return n.push([-f,-f],[-f,f],[f,f],[f,-f]);if(!(r>2)){var u=t[e],i=n[0],o=n[1],a=u[0],c=u[1],l=i[0],s=i[1],h=o[0],g=o[1],p=Math.abs(h-l),d=g-s;if(Math.abs(d)<Go){var v=s>c?-f:f;n.push([-f,v],[f,v])}else if(Go>p){var m=l>a?-f:f;n.push([m,-f],[m,f])}else{var v=(l-a)*(g-s)>(h-l)*(s-c)?f:-f,y=Math.abs(d)-p;Math.abs(y)<Go?n.push([0>d?v:-v,v]):(y>0&&(v*=-1),n.push([-f,v],[f,v]))}}}),u)for(o=0;s>o;++o)u.clip(a[o]);for(o=0;s>o;++o)a[o].point=n[o];return a}var e=Ze,r=Ve,u=null;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.clipExtent=function(n){if(!arguments.length)return u&&[u[0],u[2]];if(null==n)u=null;else{var e=+n[0][0],r=+n[0][1],i=+n[1][0],o=+n[1][1];u=mo.geom.polygon([[e,r],[e,o],[i,o],[i,r]])}return t},t.size=function(n){return arguments.length?t.clipExtent(n&&[[0,0],n]):u&&u[2]},t.links=function(n){var t,u,i,o=n.map(function(){return[]}),a=[],c=pt(e),l=pt(r),s=n.length;if(c===Ze&&l===Ve)t=n;else for(t=new Array(s),i=0;s>i;++i)t[i]=[+c.call(this,u=n[i],i),+l.call(this,u,i)];return vr(t,function(t){var e=t.region.l.index,r=t.region.r.index;o[e][r]||(o[e][r]=o[r][e]=!0,a.push({source:n[e],target:n[r]}))}),a},t.triangles=function(n){if(e===Ze&&r===Ve)return mo.geom.delaunay(n);for(var t,u=new Array(c),i=pt(e),o=pt(r),a=-1,c=n.length;++a<c;)(u[a]=[+i.call(this,t=n[a],a),+o.call(this,t,a)]).data=t;return mo.geom.delaunay(u).map(function(n){return n.map(function(n){return n.data})})},t)};var yc={l:"r",r:"l"};mo.geom.quadtree=function(n,t,e,r,u){function i(n){function i(n,t,e,r,u,i,o,a){if(!isNaN(e)&&!isNaN(r))if(n.leaf){var c=n.x,s=n.y;if(null!=c)if(Math.abs(c-e)+Math.abs(s-r)<.01)l(n,t,e,r,u,i,o,a);else{var f=n.point;n.x=n.y=n.point=null,l(n,f,c,s,u,i,o,a),l(n,t,e,r,u,i,o,a)}else n.x=e,n.y=r,n.point=t}else l(n,t,e,r,u,i,o,a)}function l(n,t,e,r,u,o,a,c){var l=.5*(u+a),s=.5*(o+c),f=e>=l,h=r>=s,g=(h<<1)+f;n.leaf=!1,n=n.nodes[g]||(n.nodes[g]=Mr()),f?u=l:a=l,h?o=s:c=s,i(n,t,e,r,u,o,a,c)}var s,f,h,g,p,d,v,m,y,M=pt(a),x=pt(c);if(null!=t)d=t,v=e,m=r,y=u;else if(m=y=-(d=v=1/0),f=[],h=[],p=n.length,o)for(g=0;p>g;++g)s=n[g],s.x<d&&(d=s.x),s.y<v&&(v=s.y),s.x>m&&(m=s.x),s.y>y&&(y=s.y),f.push(s.x),h.push(s.y);else for(g=0;p>g;++g){var b=+M(s=n[g],g),_=+x(s,g);d>b&&(d=b),v>_&&(v=_),b>m&&(m=b),_>y&&(y=_),f.push(b),h.push(_)}var w=m-d,S=y-v;w>S?y=v+w:m=d+S;var E=Mr();if(E.add=function(n){i(E,n,+M(n,++g),+x(n,g),d,v,m,y)},E.visit=function(n){xr(n,E,d,v,m,y)},g=-1,null==t){for(;++g<p;)i(E,n[g],f[g],h[g],d,v,m,y);--g}else n.forEach(E.add);return f=h=n=s=null,E}var o,a=Ze,c=Ve;return(o=arguments.length)?(a=mr,c=yr,3===o&&(u=e,r=t,e=t=0),i(n)):(i.x=function(n){return arguments.length?(a=n,i):a},i.y=function(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)},mo.interpolateRgb=br,mo.interpolateObject=_r,mo.interpolateNumber=wr,mo.interpolateString=Sr;var Mc=/[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g;mo.interpolate=Er,mo.interpolators=[function(n,t){var e=typeof t;return("string"===e?da.has(t)||/^(#|rgb\(|hsl\()/.test(t)?br:Sr:t instanceof Z?br:"object"===e?Array.isArray(t)?kr:_r:wr)(n,t)}],mo.interpolateArray=kr;var xc=function(){return dt},bc=mo.map({linear:xc,poly:Dr,quad:function(){return qr},cubic:function(){return zr},sin:function(){return jr},exp:function(){return Lr},circle:function(){return Hr},elastic:Fr,back:Pr,bounce:function(){return Or}}),_c=mo.map({"in":dt,out:Nr,"in-out":Tr,"out-in":function(n){return Tr(Nr(n))}});mo.ease=function(n){var t=n.indexOf("-"),e=t>=0?n.substring(0,t):n,r=t>=0?n.substring(t+1):"in";return e=bc.get(e)||xc,r=_c.get(r)||dt,Ar(r(e.apply(null,Array.prototype.slice.call(arguments,1))))},mo.interpolateHcl=Rr,mo.interpolateHsl=Yr,mo.interpolateLab=Ir,mo.interpolateRound=Ur,mo.transform=function(n){var t=xo.createElementNS(mo.ns.prefix.svg,"g");return(mo.transform=function(n){if(null!=n){t.setAttribute("transform",n);var e=t.transform.baseVal.consolidate()}return new Zr(e?e.matrix:wc)})(n)},Zr.prototype.toString=function(){return"translate("+this.translate+")rotate("+this.rotate+")skewX("+this.skew+")scale("+this.scale+")"};var wc={a:1,b:0,c:0,d:1,e:0,f:0};mo.interpolateTransform=Br,mo.layout={},mo.layout.bundle=function(){return function(n){for(var t=[],e=-1,r=n.length;++e<r;)t.push(Gr(n[e]));return t}},mo.layout.chord=function(){function n(){var n,l,f,h,g,p={},d=[],v=mo.range(i),m=[];for(e=[],r=[],n=0,h=-1;++h<i;){for(l=0,g=-1;++g<i;)l+=u[h][g];d.push(l),m.push(mo.range(i)),n+=l}for(o&&v.sort(function(n,t){return o(d[n],d[t])}),a&&m.forEach(function(n,t){n.sort(function(n,e){return a(u[t][n],u[t][e])})}),n=(Wo-s*i)/n,l=0,h=-1;++h<i;){for(f=l,g=-1;++g<i;){var y=v[h],M=m[y][g],x=u[y][M],b=l,_=l+=x*n;p[y+"-"+M]={index:y,subindex:M,startAngle:b,endAngle:_,value:x}}r[y]={index:y,startAngle:f,endAngle:l,value:(l-f)/n},l+=s}for(h=-1;++h<i;)for(g=h-1;++g<i;){var w=p[h+"-"+g],S=p[g+"-"+h];(w.value||S.value)&&e.push(w.value<S.value?{source:S,target:w}:{source:w,target:S})}c&&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,l={},s=0;return l.matrix=function(n){return arguments.length?(i=(u=n)&&u.length,e=r=null,l):u},l.padding=function(n){return arguments.length?(s=n,e=r=null,l):s},l.sortGroups=function(n){return arguments.length?(o=n,e=r=null,l):o},l.sortSubgroups=function(n){return arguments.length?(a=n,e=null,l):a},l.sortChords=function(n){return arguments.length?(c=n,e&&t(),l):c},l.chords=function(){return e||n(),e},l.groups=function(){return r||n(),r},l},mo.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=1/Math.sqrt(i*i+o*o);if(d>(u-e)*a){var c=t.charge*a*a;return n.px-=i*c,n.py-=o*c,!0}if(t.point&&isFinite(a)){var c=t.pointCharge*a*a;n.px-=i*c,n.py-=o*c}}return!t.charge}}function t(n){n.px=mo.event.x,n.py=mo.event.y,a.resume()}var e,r,u,i,o,a={},c=mo.dispatch("start","tick","end"),l=[1,1],s=.9,f=Sc,h=Ec,g=-30,p=.1,d=.8,v=[],m=[];return a.tick=function(){if((r*=.99)<.005)return c.end({type:"end",alpha:r=0}),!0;var t,e,a,f,h,d,y,M,x,b=v.length,_=m.length;for(e=0;_>e;++e)a=m[e],f=a.source,h=a.target,M=h.x-f.x,x=h.y-f.y,(d=M*M+x*x)&&(d=r*i[e]*((d=Math.sqrt(d))-u[e])/d,M*=d,x*=d,h.x-=M*(y=f.weight/(h.weight+f.weight)),h.y-=x*y,f.x+=M*(y=1-y),f.y+=x*y);if((y=r*p)&&(M=l[0]/2,x=l[1]/2,e=-1,y))for(;++e<b;)a=v[e],a.x+=(M-a.x)*y,a.y+=(x-a.y)*y;if(g)for(uu(t=mo.geom.quadtree(v),r,o),e=-1;++e<b;)(a=v[e]).fixed||t.visit(n(a));for(e=-1;++e<b;)a=v[e],a.fixed?(a.x=a.px,a.y=a.py):(a.x-=(a.px-(a.px=a.x))*s,a.y-=(a.py-(a.py=a.y))*s);c.tick({type:"tick",alpha:r})},a.nodes=function(n){return arguments.length?(v=n,a):v},a.links=function(n){return arguments.length?(m=n,a):m},a.size=function(n){return arguments.length?(l=n,a):l},a.linkDistance=function(n){return arguments.length?(f="function"==typeof n?n:+n,a):f},a.distance=a.linkDistance,a.linkStrength=function(n){return arguments.length?(h="function"==typeof n?n:+n,a):h},a.friction=function(n){return arguments.length?(s=+n,a):s},a.charge=function(n){return arguments.length?(g="function"==typeof n?n:+n,a):g},a.gravity=function(n){return arguments.length?(p=+n,a):p},a.theta=function(n){return arguments.length?(d=+n,a):d},a.alpha=function(n){return arguments.length?(n=+n,r?r=n>0?n:0:n>0&&(c.start({type:"start",alpha:r=n}),mo.timer(a.tick)),a):r},a.start=function(){function n(n,r){for(var u,i=t(e),o=-1,a=i.length;++o<a;)if(!isNaN(u=i[o][n]))return u;return Math.random()*r}function t(){if(!c){for(c=[],r=0;p>r;++r)c[r]=[];for(r=0;d>r;++r){var n=m[r];c[n.source.index].push(n.target),c[n.target.index].push(n.source)}}return c[e]}var e,r,c,s,p=v.length,d=m.length,y=l[0],M=l[1];for(e=0;p>e;++e)(s=v[e]).index=e,s.weight=0;for(e=0;d>e;++e)s=m[e],"number"==typeof s.source&&(s.source=v[s.source]),"number"==typeof s.target&&(s.target=v[s.target]),++s.source.weight,++s.target.weight;for(e=0;p>e;++e)s=v[e],isNaN(s.x)&&(s.x=n("x",y)),isNaN(s.y)&&(s.y=n("y",M)),isNaN(s.px)&&(s.px=s.x),isNaN(s.py)&&(s.py=s.y);if(u=[],"function"==typeof f)for(e=0;d>e;++e)u[e]=+f.call(this,m[e],e);else for(e=0;d>e;++e)u[e]=f;if(i=[],"function"==typeof h)for(e=0;d>e;++e)i[e]=+h.call(this,m[e],e);else for(e=0;d>e;++e)i[e]=h;if(o=[],"function"==typeof g)for(e=0;p>e;++e)o[e]=+g.call(this,v[e],e);else for(e=0;p>e;++e)o[e]=g;return a.resume()},a.resume=function(){return a.alpha(.1)},a.stop=function(){return a.alpha(0)},a.drag=function(){return e||(e=mo.behavior.drag().origin(dt).on("dragstart.force",nu).on("drag.force",t).on("dragend.force",tu)),arguments.length?(this.on("mouseover.force",eu).on("mouseout.force",ru).call(e),void 0):e},mo.rebind(a,c,"on")};var Sc=20,Ec=1;mo.layout.hierarchy=function(){function n(t,o,a){var c=u.call(e,t,o);if(t.depth=o,a.push(t),c&&(l=c.length)){for(var l,s,f=-1,h=t.children=[],g=0,p=o+1;++f<l;)s=n(c[f],p,a),s.parent=t,h.push(s),g+=s.value;r&&h.sort(r),i&&(t.value=g)}else i&&(t.value=+i.call(e,t,o)||0);return t}function t(n,r){var u=n.children,o=0;if(u&&(a=u.length))for(var a,c=-1,l=r+1;++c<a;)o+=t(u[c],l);else i&&(o=+i.call(e,n,r)||0);return i&&(n.value=o),o}function e(t){var e=[];return n(t,0,e),e}var r=cu,u=ou,i=au;return e.sort=function(n){return arguments.length?(r=n,e):r},e.children=function(n){return arguments.length?(u=n,e):u},e.value=function(n){return arguments.length?(i=n,e):i},e.revalue=function(n){return t(n,0),n},e},mo.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&&(o=i.length)){var o,a,c,l=-1;for(r=t.value?r/t.value:0;++l<o;)n(a=i[l],e,c=a.value*r,u),e+=c}}function t(n){var e=n.children,r=0;if(e&&(u=e.length))for(var u,i=-1;++i<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=mo.layout.hierarchy(),u=[1,1];return e.size=function(n){return arguments.length?(u=n,e):u},iu(e,r)},mo.layout.pie=function(){function n(i){var o=i.map(function(e,r){return+t.call(n,e,r)}),a=+("function"==typeof r?r.apply(this,arguments):r),c=(("function"==typeof u?u.apply(this,arguments):u)-a)/mo.sum(o),l=mo.range(i.length);null!=e&&l.sort(e===kc?function(n,t){return o[t]-o[n]}:function(n,t){return e(i[n],i[t])});var s=[];return l.forEach(function(n){var t;s[n]={data:i[n],value:t=o[n],startAngle:a,endAngle:a+=t*c}}),s}var t=Number,e=kc,r=0,u=Wo;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 kc={};mo.layout.stack=function(){function n(a,c){var l=a.map(function(e,r){return t.call(n,e,r)}),s=l.map(function(t){return t.map(function(t,e){return[i.call(n,t,e),o.call(n,t,e)]})}),f=e.call(n,s,c);l=mo.permute(l,f),s=mo.permute(s,f);var h,g,p,d=r.call(n,s,c),v=l.length,m=l[0].length;for(g=0;m>g;++g)for(u.call(n,l[0][g],p=d[g],s[0][g][1]),h=1;v>h;++h)u.call(n,l[h][g],p+=s[h-1][g][1],s[h][g][1]);return a}var t=dt,e=gu,r=pu,u=hu,i=su,o=fu;return n.values=function(e){return arguments.length?(t=e,n):t},n.order=function(t){return arguments.length?(e="function"==typeof t?t:Ac.get(t)||gu,n):e},n.offset=function(t){return arguments.length?(r="function"==typeof t?t:Nc.get(t)||pu,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 Ac=mo.map({"inside-out":function(n){var t,e,r=n.length,u=n.map(du),i=n.map(vu),o=mo.range(r).sort(function(n,t){return u[n]-u[t]}),a=0,c=0,l=[],s=[];for(t=0;r>t;++t)e=o[t],c>a?(a+=i[e],l.push(e)):(c+=i[e],s.push(e));return s.reverse().concat(l)},reverse:function(n){return mo.range(n.length).reverse()},"default":gu}),Nc=mo.map({silhouette:function(n){var t,e,r,u=n.length,i=n[0].length,o=[],a=0,c=[];for(e=0;i>e;++e){for(t=0,r=0;u>t;t++)r+=n[t][e][1];r>a&&(a=r),o.push(r)}for(e=0;i>e;++e)c[e]=(a-o[e])/2;return c},wiggle:function(n){var t,e,r,u,i,o,a,c,l,s=n.length,f=n[0],h=f.length,g=[];for(g[0]=c=l=0,e=1;h>e;++e){for(t=0,u=0;s>t;++t)u+=n[t][e][1];for(t=0,i=0,a=f[e][0]-f[e-1][0];s>t;++t){for(r=0,o=(n[t][e][1]-n[t][e-1][1])/(2*a);t>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,l>c&&(l=c)}for(e=0;h>e;++e)g[e]-=l;return g},expand:function(n){var t,e,r,u=n.length,i=n[0].length,o=1/u,a=[];for(e=0;i>e;++e){for(t=0,r=0;u>t;t++)r+=n[t][e][1];if(r)for(t=0;u>t;t++)n[t][e][1]/=r;else for(t=0;u>t;t++)n[t][e][1]=o}for(e=0;i>e;++e)a[e]=0;return a},zero:pu});mo.layout.histogram=function(){function n(n,i){for(var o,a,c=[],l=n.map(e,this),s=r.call(this,l,i),f=u.call(this,s,l,i),i=-1,h=l.length,g=f.length-1,p=t?1:1/h;++i<g;)o=c[i]=[],o.dx=f[i+1]-(o.x=f[i]),o.y=0;if(g>0)for(i=-1;++i<h;)a=l[i],a>=s[0]&&a<=s[1]&&(o=c[mo.bisect(f,a,1,g)-1],o.y+=p,o.push(n[i]));return c}var t=!0,e=Number,r=xu,u=yu;return n.value=function(t){return arguments.length?(e=t,n):e},n.range=function(t){return arguments.length?(r=pt(t),n):r},n.bins=function(t){return arguments.length?(u="number"==typeof t?function(n){return Mu(n,t)}:pt(t),n):u},n.frequency=function(e){return arguments.length?(t=!!e,n):t},n},mo.layout.tree=function(){function n(n,i){function o(n,t){var r=n.children,u=n._tree;if(r&&(i=r.length)){for(var i,a,l,s=r[0],f=s,h=-1;++h<i;)l=r[h],o(l,a),f=c(l,a,f),a=l;Tu(n);var g=.5*(s._tree.prelim+l._tree.prelim);t?(u.prelim=t._tree.prelim+e(n,t),u.mod=u.prelim-g):u.prelim=g}else t&&(u.prelim=t._tree.prelim+e(n,t))}function a(n,t){n.x=n._tree.prelim+t;var e=n.children;if(e&&(r=e.length)){var r,u=-1;for(t+=n._tree.mod;++u<r;)a(e[u],t)}}function c(n,t,r){if(t){for(var u,i=n,o=n,a=t,c=n.parent.children[0],l=i._tree.mod,s=o._tree.mod,f=a._tree.mod,h=c._tree.mod;a=wu(a),i=_u(i),a&&i;)c=_u(c),o=wu(o),o._tree.ancestor=n,u=a._tree.prelim+f-i._tree.prelim-l+e(a,i),u>0&&(qu(zu(a,n,r),n,u),l+=u,s+=u),f+=a._tree.mod,l+=i._tree.mod,h+=c._tree.mod,s+=o._tree.mod;a&&!wu(o)&&(o._tree.thread=a,o._tree.mod+=f-s),i&&!_u(c)&&(c._tree.thread=i,c._tree.mod+=l-h,r=n)}return r}var l=t.call(this,n,i),s=l[0];Nu(s,function(n,t){n._tree={ancestor:n,prelim:0,mod:0,change:0,shift:0,number:t?t._tree.number+1:0}}),o(s),a(s,-s._tree.prelim);var f=Su(s,ku),h=Su(s,Eu),g=Su(s,Au),p=f.x-e(f,h)/2,d=h.x+e(h,f)/2,v=g.depth||1;return Nu(s,u?function(n){n.x*=r[0],n.y=n.depth*r[1],delete n._tree}:function(n){n.x=(n.x-p)/(d-p)*r[0],n.y=n.depth/v*r[1],delete n._tree}),l}var t=mo.layout.hierarchy().sort(null).value(null),e=bu,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},iu(n,t)},mo.layout.pack=function(){function n(n,i){var o=e.call(this,n,i),a=o[0],c=u[0],l=u[1],s=null==t?Math.sqrt:"function"==typeof t?t:function(){return t};if(a.x=a.y=0,Nu(a,function(n){n.r=+s(n.value)}),Nu(a,Hu),r){var f=r*(t?1:Math.max(2*a.r/c,2*a.r/l))/2;Nu(a,function(n){n.r+=f}),Nu(a,Hu),Nu(a,function(n){n.r-=f})}return Ou(a,c/2,l/2,t?1:1/Math.max(2*a.r/c,2*a.r/l)),o}var t,e=mo.layout.hierarchy().sort(Cu),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||"function"==typeof e?e:+e,n):t},n.padding=function(t){return arguments.length?(r=+t,n):r},iu(n,e)},mo.layout.cluster=function(){function n(n,i){var o,a=t.call(this,n,i),c=a[0],l=0;Nu(c,function(n){var t=n.children;t&&t.length?(n.x=Iu(t),n.y=Yu(t)):(n.x=o?l+=e(n,o):0,n.y=0,o=n)});var s=Uu(c),f=Zu(c),h=s.x-e(s,f)/2,g=f.x+e(f,s)/2;return Nu(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=mo.layout.hierarchy().sort(null).value(null),e=bu,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},iu(n,t)},mo.layout.treemap=function(){function n(n,t){for(var e,r,u=-1,i=n.length;++u<i;)r=(e=n[u]).value*(0>t?0:t),e.area=isNaN(r)||0>=r?0:r}function t(e){var i=e.children;if(i&&i.length){var o,a,c,l=f(e),s=[],h=i.slice(),p=1/0,d="slice"===g?l.dx:"dice"===g?l.dy:"slice-dice"===g?1&e.depth?l.dy:l.dx:Math.min(l.dx,l.dy);for(n(h,l.dx*l.dy/e.value),s.area=0;(c=h.length)>0;)s.push(o=h[c-1]),s.area+=o.area,"squarify"!==g||(a=r(s,d))<=p?(h.pop(),p=a):(s.area-=s.pop().area,u(s,d,l,!1),d=Math.min(l.dx,l.dy),s.length=s.area=0,p=1/0);s.length&&(u(s,d,l,!0),s.length=s.area=0),i.forEach(t)}}function e(t){var r=t.children;if(r&&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&&(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<a;)(e=n[o].area)&&(i>e&&(i=e),e>u&&(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,l=e.y,s=t?c(n.area/t):0;if(t==e.dx){for((r||s>e.dy)&&(s=e.dy);++i<o;)u=n[i],u.x=a,u.y=l,u.dy=s,a+=u.dx=Math.min(e.x+e.dx-a,s?c(u.area/s):0);u.z=!0,u.dx+=e.x+e.dx-a,e.y+=s,e.dy-=s}else{for((r||s>e.dx)&&(s=e.dx);++i<o;)u=n[i],u.x=a,u.y=l,u.dx=s,l+=u.dy=Math.min(e.y+e.dy-l,s?c(u.area/s):0);u.z=!1,u.dy+=e.y+e.dy-l,e.x+=s,e.dx-=s}}function i(r){var u=o||a(r),i=u[0];return i.x=0,i.y=0,i.dx=l[0],i.dy=l[1],o&&a.revalue(i),n([i],i.dx*i.dy/i.value),(o?e:t)(i),h&&(o=u),u}var o,a=mo.layout.hierarchy(),c=Math.round,l=[1,1],s=null,f=Vu,h=!1,g="squarify",p=.5*(1+Math.sqrt(5));return i.size=function(n){return arguments.length?(l=n,i):l},i.padding=function(n){function t(t){var e=n.call(i,t,t.depth);return null==e?Vu(t):Xu(t,"number"==typeof e?[e,e,e,e]:e)}function e(t){return Xu(t,n)}if(!arguments.length)return s;var r;return f=null==(s=n)?Vu:"function"==(r=typeof n)?t:"number"===r?(n=[n,n,n,n],e):e,i},i.round=function(n){return 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+"",i):g},iu(i,a)},mo.random={normal:function(n,t){var e=arguments.length;return 2>e&&(t=1),1>e&&(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>1);return n+t*e*Math.sqrt(-2*Math.log(u)/u)}},logNormal:function(){var n=mo.random.normal.apply(mo,arguments);return function(){return Math.exp(n())}},irwinHall:function(n){return function(){for(var t=0,e=0;n>e;e++)t+=Math.random();return t/n}}},mo.scale={};var Tc={floor:dt,ceil:dt};mo.scale.linear=function(){return Qu([0,1],[0,1],Er,!1)},mo.scale.log=function(){return ii(mo.scale.linear().domain([0,1]),10,!0,[1,10])};var qc=mo.format(".0e"),zc={floor:function(n){return-Math.ceil(-n)},ceil:function(n){return-Math.floor(-n)}};mo.scale.pow=function(){return oi(mo.scale.linear(),1,[0,1])},mo.scale.sqrt=function(){return mo.scale.pow().exponent(.5)},mo.scale.ordinal=function(){return ci([],{t:"range",a:[[]]})},mo.scale.category10=function(){return mo.scale.ordinal().range(Cc)},mo.scale.category20=function(){return mo.scale.ordinal().range(Dc)},mo.scale.category20b=function(){return mo.scale.ordinal().range(jc)},mo.scale.category20c=function(){return mo.scale.ordinal().range(Lc)};var Cc=[2062260,16744206,2924588,14034728,9725885,9197131,14907330,8355711,12369186,1556175].map(it),Dc=[2062260,11454440,16744206,16759672,2924588,10018698,14034728,16750742,9725885,12955861,9197131,12885140,14907330,16234194,8355711,13092807,12369186,14408589,1556175,10410725].map(it),jc=[3750777,5395619,7040719,10264286,6519097,9216594,11915115,13556636,9202993,12426809,15186514,15190932,8666169,11356490,14049643,15177372,8077683,10834324,13528509,14589654].map(it),Lc=[3244733,7057110,10406625,13032431,15095053,16616764,16625259,16634018,3253076,7652470,10607003,13101504,7695281,10394312,12369372,14342891,6513507,9868950,12434877,14277081].map(it);mo.scale.quantile=function(){return li([],[])},mo.scale.quantize=function(){return si(0,1,[0,1])},mo.scale.threshold=function(){return fi([.5],[0,1])},mo.scale.identity=function(){return hi([0,1])},mo.svg.arc=function(){function n(){var n=t.apply(this,arguments),i=e.apply(this,arguments),o=r.apply(this,arguments)+Hc,a=u.apply(this,arguments)+Hc,c=(o>a&&(c=o,o=a,a=c),a-o),l=Bo>c?"0":"1",s=Math.cos(o),f=Math.sin(o),h=Math.cos(a),g=Math.sin(a);return c>=Fc?n?"M0,"+i+"A"+i+","+i+" 0 1,1 0,"+-i+"A"+i+","+i+" 0 1,1 0,"+i+"M0,"+n+"A"+n+","+n+" 0 1,0 0,"+-n+"A"+n+","+n+" 0 1,0 0,"+n+"Z":"M0,"+i+"A"+i+","+i+" 0 1,1 0,"+-i+"A"+i+","+i+" 0 1,1 0,"+i+"Z":n?"M"+i*s+","+i*f+"A"+i+","+i+" 0 "+l+",1 "+i*h+","+i*g+"L"+n*h+","+n*g+"A"+n+","+n+" 0 "+l+",0 "+n*s+","+n*f+"Z":"M"+i*s+","+i*f+"A"+i+","+i+" 0 "+l+",1 "+i*h+","+i*g+"L0,0"+"Z"}var t=gi,e=pi,r=di,u=vi;return n.innerRadius=function(e){return arguments.length?(t=pt(e),n):t},n.outerRadius=function(t){return arguments.length?(e=pt(t),n):e},n.startAngle=function(t){return arguments.length?(r=pt(t),n):r},n.endAngle=function(t){return arguments.length?(u=pt(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+Hc;return[Math.cos(i)*n,Math.sin(i)*n]},n};var Hc=-Jo,Fc=Wo-Go;mo.svg.line.radial=function(){var n=Ue(mi);return n.radius=n.x,delete n.x,n.angle=n.y,delete n.y,n},We.reverse=Je,Je.reverse=We,mo.svg.area=function(){return yi(dt)},mo.svg.area.radial=function(){var n=yi(mi);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},mo.svg.chord=function(){function n(n,a){var c=t(this,i,n,a),l=t(this,o,n,a);return"M"+c.p0+r(c.r,c.p1,c.a1-c.a0)+(e(c,l)?u(c.r,c.p1,c.r,c.p0):u(c.r,c.p1,l.r,l.p0)+r(l.r,l.p1,l.a1-l.a0)+u(l.r,l.p1,c.r,c.p0))+"Z"}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)+Hc,s=l.call(n,u,r)+Hc;return{r:i,a0:o,a1:s,p0:[i*Math.cos(o),i*Math.sin(o)],p1:[i*Math.cos(s),i*Math.sin(s)]}}function e(n,t){return n.a0==t.a0&&n.a1==t.a1}function r(n,t,e){return"A"+n+","+n+" 0 "+ +(e>Bo)+",1 "+t}function u(n,t,e,r){return"Q 0,0 "+r}var i=De,o=je,a=Mi,c=di,l=vi;return n.radius=function(t){return arguments.length?(a=pt(t),n):a},n.source=function(t){return arguments.length?(i=pt(t),n):i},n.target=function(t){return arguments.length?(o=pt(t),n):o},n.startAngle=function(t){return arguments.length?(c=pt(t),n):c},n.endAngle=function(t){return arguments.length?(l=pt(t),n):l},n},mo.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),"M"+c[0]+"C"+c[1]+" "+c[2]+" "+c[3]}var t=De,e=je,r=xi;return n.source=function(e){return arguments.length?(t=pt(e),n):t},n.target=function(t){return arguments.length?(e=pt(t),n):e},n.projection=function(t){return arguments.length?(r=t,n):r},n},mo.svg.diagonal.radial=function(){var n=mo.svg.diagonal(),t=xi,e=n.projection;return n.projection=function(n){return arguments.length?e(bi(t=n)):t},n},mo.svg.symbol=function(){function n(n,r){return(Pc.get(t.call(this,n,r))||Si)(e.call(this,n,r))}var t=wi,e=_i;return n.type=function(e){return arguments.length?(t=pt(e),n):t},n.size=function(t){return arguments.length?(e=pt(t),n):e},n};var Pc=mo.map({circle:Si,cross:function(n){var t=Math.sqrt(n/5)/2;return"M"+-3*t+","+-t+"H"+-t+"V"+-3*t+"H"+t+"V"+-t+"H"+3*t+"V"+t+"H"+t+"V"+3*t+"H"+-t+"V"+t+"H"+-3*t+"Z"},diamond:function(n){var t=Math.sqrt(n/(2*Ic)),e=t*Ic;return"M0,"+-t+"L"+e+",0"+" 0,"+t+" "+-e+",0"+"Z"},square:function(n){var t=Math.sqrt(n)/2;return"M"+-t+","+-t+"L"+t+","+-t+" "+t+","+t+" "+-t+","+t+"Z"},"triangle-down":function(n){var t=Math.sqrt(n/Yc),e=t*Yc/2;return"M0,"+e+"L"+t+","+-e+" "+-t+","+-e+"Z"},"triangle-up":function(n){var t=Math.sqrt(n/Yc),e=t*Yc/2;return"M0,"+-e+"L"+t+","+e+" "+-t+","+e+"Z"}});mo.svg.symbolTypes=Pc.keys();var Oc,Rc,Yc=Math.sqrt(3),Ic=Math.tan(30*Qo),Uc=[],Zc=0;Uc.call=Ro.call,Uc.empty=Ro.empty,Uc.node=Ro.node,Uc.size=Ro.size,mo.transition=function(n){return arguments.length?Oc?n.transition():n:Uo.transition()},mo.transition.prototype=Uc,Uc.select=function(n){var t,e,r,u=this.id,i=[];n=d(n);for(var o=-1,a=this.length;++o<a;){i.push(t=[]);for(var c=this[o],l=-1,s=c.length;++l<s;)(r=c[l])&&(e=n.call(r,r.__data__,l,o))?("__data__"in r&&(e.__data__=r.__data__),Ni(e,l,u,r.__transition__[u]),t.push(e)):t.push(null)}return Ei(i,u)},Uc.selectAll=function(n){var t,e,r,u,i,o=this.id,a=[];n=v(n);for(var c=-1,l=this.length;++c<l;)for(var s=this[c],f=-1,h=s.length;++f<h;)if(r=s[f]){i=r.__transition__[o],e=n.call(r,r.__data__,f,c),a.push(t=[]);for(var g=-1,p=e.length;++g<p;)(u=e[g])&&Ni(u,g,o,i),t.push(u)}return Ei(a,o)},Uc.filter=function(n){var t,e,r,u=[];"function"!=typeof n&&(n=k(n));for(var i=0,o=this.length;o>i;i++){u.push(t=[]);for(var e=this[i],a=0,c=e.length;c>a;a++)(r=e[a])&&n.call(r,r.__data__,a)&&t.push(r)}return Ei(u,this.id)},Uc.tween=function(n,t){var e=this.id;return arguments.length<2?this.node().__transition__[e].tween.get(n):N(this,null==t?function(t){t.__transition__[e].tween.remove(n)}:function(r){r.__transition__[e].tween.set(n,t)})},Uc.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+="",function(){var t,e=this.getAttribute(a);return e!==n&&(t=o(e,n),function(n){this.setAttribute(a,t(n))})})}function i(n){return null==n?r:(n+="",function(){var t,e=this.getAttributeNS(a.space,a.local);return e!==n&&(t=o(e,n),function(n){this.setAttributeNS(a.space,a.local,t(n))
    })})}if(arguments.length<2){for(t in n)this.attr(t,n[t]);return this}var o="transform"==n?Br:Er,a=mo.ns.qualify(n);return ki(this,"attr."+n,t,a.local?i:u)},Uc.attrTween=function(n,t){function e(n,e){var r=t.call(this,n,e,this.getAttribute(u));return r&&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&&function(n){this.setAttributeNS(u.space,u.local,r(n))}}var u=mo.ns.qualify(n);return this.tween("attr."+n,u.local?r:e)},Uc.style=function(n,t,e){function r(){this.style.removeProperty(n)}function u(t){return null==t?r:(t+="",function(){var r,u=_o.getComputedStyle(this,null).getPropertyValue(n);return u!==t&&(r=Er(u,t),function(t){this.style.setProperty(n,r(t),e)})})}var i=arguments.length;if(3>i){if("string"!=typeof n){2>i&&(t="");for(e in n)this.style(e,n[e],t);return this}e=""}return ki(this,"style."+n,t,u)},Uc.styleTween=function(n,t,e){function r(r,u){var i=t.call(this,r,u,_o.getComputedStyle(this,null).getPropertyValue(n));return i&&function(t){this.style.setProperty(n,i(t),e)}}return arguments.length<3&&(e=""),this.tween("style."+n,r)},Uc.text=function(n){return ki(this,"text",n,Ai)},Uc.remove=function(){return this.each("end.transition",function(){var n;this.__transition__.count<2&&(n=this.parentNode)&&n.removeChild(this)})},Uc.ease=function(n){var t=this.id;return arguments.length<1?this.node().__transition__[t].ease:("function"!=typeof n&&(n=mo.ease.apply(mo,arguments)),N(this,function(e){e.__transition__[t].ease=n}))},Uc.delay=function(n){var t=this.id;return N(this,"function"==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}))},Uc.duration=function(n){var t=this.id;return N(this,"function"==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}))},Uc.each=function(n,t){var e=this.id;if(arguments.length<2){var r=Rc,u=Oc;Oc=e,N(this,function(t,r,u){Rc=t.__transition__[e],n.call(t,t.__data__,r,u)}),Rc=r,Oc=u}else N(this,function(r){var u=r.__transition__[e];(u.event||(u.event=mo.dispatch("start","end"))).on(n,t)});return this},Uc.transition=function(){for(var n,t,e,r,u=this.id,i=++Zc,o=[],a=0,c=this.length;c>a;a++){o.push(n=[]);for(var t=this[a],l=0,s=t.length;s>l;l++)(e=t[l])&&(r=Object.create(e.__transition__[u]),r.delay+=r.duration,Ni(e,l,i,r)),n.push(e)}return Ei(o,i)},mo.svg.axis=function(){function n(n){n.each(function(){var n,l=mo.select(this),s=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.apply(f,a):dt:t,p=l.selectAll(".tick").data(h,f),d=p.enter().insert("g",".domain").attr("class","tick").style("opacity",Go),v=mo.transition(p.exit()).style("opacity",Go).remove(),m=mo.transition(p).style("opacity",1),y=Bu(f),M=l.selectAll(".domain").data([0]),x=(M.enter().append("path").attr("class","domain"),mo.transition(M));d.append("line"),d.append("text");var b=d.select("line"),_=m.select("line"),w=p.select("text").text(g),S=d.select("text"),E=m.select("text");switch(r){case"bottom":n=Ti,b.attr("y2",u),S.attr("y",Math.max(u,0)+o),_.attr("x2",0).attr("y2",u),E.attr("x",0).attr("y",Math.max(u,0)+o),w.attr("dy",".71em").style("text-anchor","middle"),x.attr("d","M"+y[0]+","+i+"V0H"+y[1]+"V"+i);break;case"top":n=Ti,b.attr("y2",-u),S.attr("y",-(Math.max(u,0)+o)),_.attr("x2",0).attr("y2",-u),E.attr("x",0).attr("y",-(Math.max(u,0)+o)),w.attr("dy","0em").style("text-anchor","middle"),x.attr("d","M"+y[0]+","+-i+"V0H"+y[1]+"V"+-i);break;case"left":n=qi,b.attr("x2",-u),S.attr("x",-(Math.max(u,0)+o)),_.attr("x2",-u).attr("y2",0),E.attr("x",-(Math.max(u,0)+o)).attr("y",0),w.attr("dy",".32em").style("text-anchor","end"),x.attr("d","M"+-i+","+y[0]+"H0V"+y[1]+"H"+-i);break;case"right":n=qi,b.attr("x2",u),S.attr("x",Math.max(u,0)+o),_.attr("x2",u).attr("y2",0),E.attr("x",Math.max(u,0)+o).attr("y",0),w.attr("dy",".32em").style("text-anchor","start"),x.attr("d","M"+i+","+y[0]+"H0V"+y[1]+"H"+i)}if(f.rangeBand){var k=f.rangeBand()/2,A=function(n){return f(n)+k};d.call(n,A),m.call(n,A)}else d.call(n,s),m.call(n,f),v.call(n,f)})}var t,e=mo.scale.linear(),r=Vc,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 Xc?t+"":Vc,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&&n},n};var Vc="bottom",Xc={top:1,right:1,bottom:1,left:1};mo.svg.brush=function(){function n(i){i.each(function(){var i=mo.select(this).style("pointer-events","all").style("-webkit-tap-highlight-color","rgba(0,0,0,0)").on("mousedown.brush",u).on("touchstart.brush",u),o=i.selectAll(".background").data([0]);o.enter().append("rect").attr("class","background").style("visibility","hidden").style("cursor","crosshair"),i.selectAll(".extent").data([0]).enter().append("rect").attr("class","extent").style("cursor","move");var a=i.selectAll(".resize").data(v,dt);a.exit().remove(),a.enter().append("g").attr("class",function(n){return"resize "+n}).style("cursor",function(n){return $c[n]}).append("rect").attr("x",function(n){return/[ew]$/.test(n)?-3:null}).attr("y",function(n){return/^[ns]/.test(n)?-3:null}).attr("width",6).attr("height",6).style("visibility","hidden"),a.style("display",n.empty()?"none":null);var s,f=mo.transition(i),h=mo.transition(o);c&&(s=Bu(c),h.attr("x",s[0]).attr("width",s[1]-s[0]),e(f)),l&&(s=Bu(l),h.attr("y",s[0]).attr("height",s[1]-s[0]),r(f)),t(f)})}function t(n){n.selectAll(".resize").attr("transform",function(n){return"translate("+s[+/e$/.test(n)]+","+h[+/^s/.test(n)]+")"})}function e(n){n.select(".extent").attr("x",s[0]),n.selectAll(".extent,.n>rect,.s>rect").attr("width",s[1]-s[0])}function r(n){n.select(".extent").attr("y",h[0]),n.selectAll(".extent,.e>rect,.w>rect").attr("height",h[1]-h[0])}function u(){function u(){32==mo.event.keyCode&&(N||(M=null,q[0]-=s[1],q[1]-=h[1],N=2),f())}function g(){32==mo.event.keyCode&&2==N&&(q[0]+=s[1],q[1]+=h[1],N=0,f())}function v(){var n=mo.mouse(b),u=!1;x&&(n[0]+=x[0],n[1]+=x[1]),N||(mo.event.altKey?(M||(M=[(s[0]+s[1])/2,(h[0]+h[1])/2]),q[0]=s[+(n[0]<M[0])],q[1]=h[+(n[1]<M[1])]):M=null),k&&m(n,c,0)&&(e(S),u=!0),A&&m(n,l,1)&&(r(S),u=!0),u&&(t(S),w({type:"brush",mode:N?"move":"resize"}))}function m(n,t,e){var r,u,a=Bu(t),c=a[0],l=a[1],f=q[e],g=e?h:s,v=g[1]-g[0];return N&&(c-=f,l-=v+f),r=(e?d:p)?Math.max(c,Math.min(l,n[e])):n[e],N?u=(r+=f)+v:(M&&(f=Math.max(c,Math.min(l,2*M[e]-r))),r>f?(u=r,r=f):u=f),g[0]!=r||g[1]!=u?(e?o=null:i=null,g[0]=r,g[1]=u,!0):void 0}function y(){v(),S.style("pointer-events","all").selectAll(".resize").style("display",n.empty()?"none":null),mo.select("body").style("cursor",null),z.on("mousemove.brush",null).on("mouseup.brush",null).on("touchmove.brush",null).on("touchend.brush",null).on("keydown.brush",null).on("keyup.brush",null),T(),w({type:"brushend"})}var M,x,b=this,_=mo.select(mo.event.target),w=a.of(b,arguments),S=mo.select(b),E=_.datum(),k=!/^(n|s)$/.test(E)&&c,A=!/^(e|w)$/.test(E)&&l,N=_.classed("extent"),T=L(),q=mo.mouse(b),z=mo.select(_o).on("keydown.brush",u).on("keyup.brush",g);if(mo.event.changedTouches?z.on("touchmove.brush",v).on("touchend.brush",y):z.on("mousemove.brush",v).on("mouseup.brush",y),S.interrupt().selectAll("*").interrupt(),N)q[0]=s[0]-q[0],q[1]=h[0]-q[1];else if(E){var C=+/w$/.test(E),D=+/^n/.test(E);x=[s[1-C]-q[0],h[1-D]-q[1]],q[0]=s[C],q[1]=h[D]}else mo.event.altKey&&(M=q.slice());S.style("pointer-events","none").selectAll(".resize").style("display",null),mo.select("body").style("cursor",_.style("cursor")),w({type:"brushstart"}),v()}var i,o,a=g(n,"brushstart","brush","brushend"),c=null,l=null,s=[0,0],h=[0,0],p=!0,d=!0,v=Bc[0];return n.event=function(n){n.each(function(){var n=a.of(this,arguments),t={x:s,y:h,i:i,j:o},e=this.__chart__||t;this.__chart__=t,Oc?mo.select(this).transition().each("start.brush",function(){i=e.i,o=e.j,s=e.x,h=e.y,n({type:"brushstart"})}).tween("brush:brush",function(){var e=kr(s,t.x),r=kr(h,t.y);return i=o=null,function(u){s=t.x=e(u),h=t.y=r(u),n({type:"brush",mode:"resize"})}}).each("end.brush",function(){i=t.i,o=t.j,n({type:"brush",mode:"resize"}),n({type:"brushend"})}):(n({type:"brushstart"}),n({type:"brush",mode:"resize"}),n({type:"brushend"}))})},n.x=function(t){return arguments.length?(c=t,v=Bc[!c<<1|!l],n):c},n.y=function(t){return arguments.length?(l=t,v=Bc[!c<<1|!l],n):l},n.clamp=function(t){return arguments.length?(c&&l?(p=!!t[0],d=!!t[1]):c?p=!!t:l&&(d=!!t),n):c&&l?[p,d]:c?p:l?d:null},n.extent=function(t){var e,r,u,a,f;return arguments.length?(c&&(e=t[0],r=t[1],l&&(e=e[0],r=r[0]),i=[e,r],c.invert&&(e=c(e),r=c(r)),e>r&&(f=e,e=r,r=f),(e!=s[0]||r!=s[1])&&(s=[e,r])),l&&(u=t[0],a=t[1],c&&(u=u[1],a=a[1]),o=[u,a],l.invert&&(u=l(u),a=l(a)),u>a&&(f=u,u=a,a=f),(u!=h[0]||a!=h[1])&&(h=[u,a])),n):(c&&(i?(e=i[0],r=i[1]):(e=s[0],r=s[1],c.invert&&(e=c.invert(e),r=c.invert(r)),e>r&&(f=e,e=r,r=f))),l&&(o?(u=o[0],a=o[1]):(u=h[0],a=h[1],l.invert&&(u=l.invert(u),a=l.invert(a)),u>a&&(f=u,u=a,a=f))),c&&l?[[e,u],[r,a]]:c?[e,r]:l&&[u,a])},n.clear=function(){return n.empty()||(s=[0,0],h=[0,0],i=o=null),n},n.empty=function(){return!!c&&s[0]==s[1]||!!l&&h[0]==h[1]},mo.rebind(n,a,"on")};var $c={n:"ns-resize",e:"ew-resize",s:"ns-resize",w:"ew-resize",nw:"nwse-resize",ne:"nesw-resize",se:"nwse-resize",sw:"nesw-resize"},Bc=[["n","e","s","w","nw","ne","se","sw"],["e","w"],["n","s"],[]],Wc=mo.time={},Jc=Date,Gc=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"];zi.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(){Kc.setUTCDate.apply(this._,arguments)},setDay:function(){Kc.setUTCDay.apply(this._,arguments)},setFullYear:function(){Kc.setUTCFullYear.apply(this._,arguments)},setHours:function(){Kc.setUTCHours.apply(this._,arguments)},setMilliseconds:function(){Kc.setUTCMilliseconds.apply(this._,arguments)},setMinutes:function(){Kc.setUTCMinutes.apply(this._,arguments)},setMonth:function(){Kc.setUTCMonth.apply(this._,arguments)},setSeconds:function(){Kc.setUTCSeconds.apply(this._,arguments)},setTime:function(){Kc.setTime.apply(this._,arguments)}};var Kc=Date.prototype,Qc="%a %b %e %X %Y",nl="%m/%d/%Y",tl="%H:%M:%S",el=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],rl=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],ul=["January","February","March","April","May","June","July","August","September","October","November","December"],il=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];Wc.year=Ci(function(n){return n=Wc.day(n),n.setMonth(0,1),n},function(n,t){n.setFullYear(n.getFullYear()+t)},function(n){return n.getFullYear()}),Wc.years=Wc.year.range,Wc.years.utc=Wc.year.utc.range,Wc.day=Ci(function(n){var t=new Jc(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}),Wc.days=Wc.day.range,Wc.days.utc=Wc.day.utc.range,Wc.dayOfYear=function(n){var t=Wc.year(n);return Math.floor((n-t-6e4*(n.getTimezoneOffset()-t.getTimezoneOffset()))/864e5)},Gc.forEach(function(n,t){n=n.toLowerCase(),t=7-t;var e=Wc[n]=Ci(function(n){return(n=Wc.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=Wc.year(n).getDay();return Math.floor((Wc.dayOfYear(n)+(e+t)%7)/7)-(e!==t)});Wc[n+"s"]=e.range,Wc[n+"s"].utc=e.utc.range,Wc[n+"OfYear"]=function(n){var e=Wc.year(n).getDay();return Math.floor((Wc.dayOfYear(n)+(e+t)%7)/7)}}),Wc.week=Wc.sunday,Wc.weeks=Wc.sunday.range,Wc.weeks.utc=Wc.sunday.utc.range,Wc.weekOfYear=Wc.sundayOfYear,Wc.format=ji;var ol=Hi(el),al=Fi(el),cl=Hi(rl),ll=Fi(rl),sl=Hi(ul),fl=Fi(ul),hl=Hi(il),gl=Fi(il),pl=/^%/,dl={"-":"",_:" ",0:"0"},vl={a:function(n){return rl[n.getDay()]},A:function(n){return el[n.getDay()]},b:function(n){return il[n.getMonth()]},B:function(n){return ul[n.getMonth()]},c:ji(Qc),d:function(n,t){return Pi(n.getDate(),t,2)},e:function(n,t){return Pi(n.getDate(),t,2)},H:function(n,t){return Pi(n.getHours(),t,2)},I:function(n,t){return Pi(n.getHours()%12||12,t,2)},j:function(n,t){return Pi(1+Wc.dayOfYear(n),t,3)},L:function(n,t){return Pi(n.getMilliseconds(),t,3)},m:function(n,t){return Pi(n.getMonth()+1,t,2)},M:function(n,t){return Pi(n.getMinutes(),t,2)},p:function(n){return n.getHours()>=12?"PM":"AM"},S:function(n,t){return Pi(n.getSeconds(),t,2)},U:function(n,t){return Pi(Wc.sundayOfYear(n),t,2)},w:function(n){return n.getDay()},W:function(n,t){return Pi(Wc.mondayOfYear(n),t,2)},x:ji(nl),X:ji(tl),y:function(n,t){return Pi(n.getFullYear()%100,t,2)},Y:function(n,t){return Pi(n.getFullYear()%1e4,t,4)},Z:ao,"%":function(){return"%"}},ml={a:Oi,A:Ri,b:Zi,B:Vi,c:Xi,d:no,e:no,H:eo,I:eo,j:to,L:io,m:Qi,M:ro,p:oo,S:uo,U:Ii,w:Yi,W:Ui,x:$i,X:Bi,y:Ji,Y:Wi,Z:Gi,"%":co},yl=/^\s*\d+/,Ml=mo.map({am:0,pm:1});ji.utc=lo;var xl=lo("%Y-%m-%dT%H:%M:%S.%LZ");ji.iso=Date.prototype.toISOString&&+new Date("2000-01-01T00:00:00.000Z")?so:xl,so.parse=function(n){var t=new Date(n);return isNaN(t)?null:t},so.toString=xl.toString,Wc.second=Ci(function(n){return new Jc(1e3*Math.floor(n/1e3))},function(n,t){n.setTime(n.getTime()+1e3*Math.floor(t))},function(n){return n.getSeconds()}),Wc.seconds=Wc.second.range,Wc.seconds.utc=Wc.second.utc.range,Wc.minute=Ci(function(n){return new Jc(6e4*Math.floor(n/6e4))},function(n,t){n.setTime(n.getTime()+6e4*Math.floor(t))},function(n){return n.getMinutes()}),Wc.minutes=Wc.minute.range,Wc.minutes.utc=Wc.minute.utc.range,Wc.hour=Ci(function(n){var t=n.getTimezoneOffset()/60;return new Jc(36e5*(Math.floor(n/36e5-t)+t))},function(n,t){n.setTime(n.getTime()+36e5*Math.floor(t))},function(n){return n.getHours()}),Wc.hours=Wc.hour.range,Wc.hours.utc=Wc.hour.utc.range,Wc.month=Ci(function(n){return n=Wc.day(n),n.setDate(1),n},function(n,t){n.setMonth(n.getMonth()+t)},function(n){return n.getMonth()}),Wc.months=Wc.month.range,Wc.months.utc=Wc.month.utc.range;var bl=[1e3,5e3,15e3,3e4,6e4,3e5,9e5,18e5,36e5,108e5,216e5,432e5,864e5,1728e5,6048e5,2592e6,7776e6,31536e6],_l=[[Wc.second,1],[Wc.second,5],[Wc.second,15],[Wc.second,30],[Wc.minute,1],[Wc.minute,5],[Wc.minute,15],[Wc.minute,30],[Wc.hour,1],[Wc.hour,3],[Wc.hour,6],[Wc.hour,12],[Wc.day,1],[Wc.day,2],[Wc.week,1],[Wc.month,1],[Wc.month,3],[Wc.year,1]],wl=[[ji("%Y"),Vt],[ji("%B"),function(n){return n.getMonth()}],[ji("%b %d"),function(n){return 1!=n.getDate()}],[ji("%a %d"),function(n){return n.getDay()&&1!=n.getDate()}],[ji("%I %p"),function(n){return n.getHours()}],[ji("%I:%M"),function(n){return n.getMinutes()}],[ji(":%S"),function(n){return n.getSeconds()}],[ji(".%L"),function(n){return n.getMilliseconds()}]],Sl=go(wl);_l.year=Wc.year,Wc.scale=function(){return fo(mo.scale.linear(),_l,Sl)};var El={range:function(n,t,e){return mo.range(+n,+t,e).map(ho)}},kl=_l.map(function(n){return[n[0].utc,n[1]]}),Al=[[lo("%Y"),Vt],[lo("%B"),function(n){return n.getUTCMonth()}],[lo("%b %d"),function(n){return 1!=n.getUTCDate()}],[lo("%a %d"),function(n){return n.getUTCDay()&&1!=n.getUTCDate()}],[lo("%I %p"),function(n){return n.getUTCHours()}],[lo("%I:%M"),function(n){return n.getUTCMinutes()}],[lo(":%S"),function(n){return n.getUTCSeconds()}],[lo(".%L"),function(n){return n.getUTCMilliseconds()}]],Nl=go(Al);return kl.year=Wc.year.utc,Wc.scale.utc=function(){return fo(mo.scale.linear(),kl,Nl)},mo.text=vt(function(n){return n.responseText}),mo.json=function(n,t){return mt(n,"application/json",po,t)},mo.html=function(n,t){return mt(n,"text/html",vo,t)},mo.xml=vt(function(n){return n.responseXML}),mo}();������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������

Rickshaw is a simple framework for drawing charts of time series data on a web page, built on top of Mike Bostock's delightful D3 library. These charts can be powered by static historical data sets, or living data that continuously updates in real time.