Skip to content
This repository

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse code

use heatmap.js and refresh seat positions

  • Loading branch information...
commit 8412fd885ecbb548a2538169fe7afa63bdf65ce3 1 parent 6c8be55
Alexandre Girard authored
BIN  heatmap_js/.DS_Store
Binary file not shown
358 heatmap_js/heatmap.js
... ... @@ -0,0 +1,358 @@
  1 +/*
  2 + * heatmap.js 1.0 - JavaScript Heatmap Library
  3 + *
  4 + * Copyright (c) 2011, Patrick Wied (http://www.patrick-wied.at)
  5 + * Dual-licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)
  6 + * and the Beerware (http://en.wikipedia.org/wiki/Beerware) license.
  7 + */
  8 +
  9 +(function(w){
  10 + // the heatmapFactory creates heatmap instances
  11 + var heatmapFactory = (function(){
  12 +
  13 + // store object constructor
  14 + // a heatmap contains a store
  15 + // the store has to know about the heatmap in order to trigger heatmap updates when datapoints get added
  16 + function store(hmap){
  17 +
  18 + var _ = {
  19 + // data is a two dimensional array
  20 + // a datapoint gets saved as data[point-x-value][point-y-value]
  21 + // the value at [point-x-value][point-y-value] is the occurrence of the datapoint
  22 + data: [],
  23 + // tight coupling of the heatmap object
  24 + heatmap: hmap
  25 + };
  26 + // the max occurrence - the heatmaps radial gradient alpha transition is based on it
  27 + this.max = 0;
  28 +
  29 + this.get = function(key){
  30 + return _[key];
  31 + },
  32 + this.set = function(key, value){
  33 + _[key] = value;
  34 + };
  35 + };
  36 +
  37 + store.prototype = {
  38 + // function for adding datapoints to the store
  39 + // datapoints are usually defined by x and y but could also contain a third parameter which represents the occurrence
  40 + addDataPoint: function(x, y){
  41 + if(x < 0 || y < 0)
  42 + return;
  43 +
  44 + var heatmap = this.get("heatmap"),
  45 + data = this.get("data");
  46 +
  47 + if(!data[x]) data[x] = [];
  48 + if(!data[x][y]) data[x][y] = 1;
  49 + // if count parameter is set increment by count otherwise by 1
  50 + data[x][y]+=(arguments.length<3)?1:arguments[2];
  51 +
  52 + // do we have a new maximum?
  53 + if(this.max < data[x][y]){
  54 + this.max = data[x][y];
  55 + // max changed, we need to redraw all existing(lower) datapoints
  56 + heatmap.get("actx").clearRect(0,0,heatmap.get("width"),heatmap.get("height"));
  57 + for(var one in data)
  58 + for(var two in data[one])
  59 + heatmap.drawAlpha(one, two, data[one][two]);
  60 +
  61 + // @TODO
  62 + // implement feature
  63 + // heatmap.drawLegend(); ?
  64 + return;
  65 + }
  66 + heatmap.drawAlpha(x, y, data[x][y]);
  67 + },
  68 + setDataSet: function(obj){
  69 +
  70 + this.max = obj.max;
  71 + var heatmap = this.get("heatmap"),
  72 + data = this.get("data"),
  73 + d = obj.data,
  74 + dlen = d.length;
  75 + // clear the heatmap before the data set gets drawn
  76 + heatmap.clear();
  77 +
  78 + while(dlen--){
  79 + var point = d[dlen];
  80 + heatmap.drawAlpha(point.x, point.y, point.count);
  81 + if(!data[point.x]) data[point.x] = [];
  82 + if(!data[point.x][point.y]) data[point.x][point.y] = 1;
  83 + data[point.x][point.y]+=point.count;
  84 + }
  85 + },
  86 + exportDataSet: function(){
  87 + var data = this.get("data");
  88 + var exportData = [];
  89 + for(var one in data){
  90 + // jump over undefined indexes
  91 + if(one === undefined)
  92 + continue;
  93 + for(var two in data[one]){
  94 + if(two === undefined)
  95 + continue;
  96 + // if both indexes are defined, push the values into the array
  97 + exportData.push({x: parseInt(one, 10), y: parseInt(two, 10), count: data[one][two]});
  98 + }
  99 + }
  100 +
  101 + return exportData;
  102 + },
  103 + generateRandomDataSet: function(points){
  104 + var heatmap = this.get("heatmap"),
  105 + w = heatmap.get("width"),
  106 + h = heatmap.get("height");
  107 + var randomset = {},
  108 + max = Math.floor(Math.random()*1000+1);
  109 + randomset.max = max;
  110 + var data = [];
  111 + while(points--){
  112 + data.push({x: Math.floor(Math.random()*w+1), y: Math.floor(Math.random()*h+1), count: Math.floor(Math.random()*max+1)});
  113 + }
  114 + randomset.data = data;
  115 + this.setDataSet(randomset);
  116 + }
  117 + };
  118 +
  119 +
  120 + // heatmap object constructor
  121 + function heatmap(config){
  122 + // private variables
  123 + var _ = {
  124 + radiusIn : 20,
  125 + radiusOut : 40,
  126 + element : {},
  127 + canvas : {},
  128 + acanvas: {},
  129 + ctx : {},
  130 + actx : {},
  131 + visible : true,
  132 + width : 0,
  133 + height : 0,
  134 + max : false,
  135 + gradient : false,
  136 + opacity: 180
  137 + };
  138 + // heatmap store containing the datapoints and information about the maximum
  139 + // accessible via instance.store
  140 + this.store = new store(this);
  141 +
  142 + this.get = function(key){
  143 + return _[key];
  144 + },
  145 + this.set = function(key, value){
  146 + _[key] = value;
  147 + };
  148 + // configure the heatmap when an instance gets created
  149 + this.configure(config);
  150 + // and initialize it
  151 + this.init();
  152 + };
  153 +
  154 + // public functions
  155 + heatmap.prototype = {
  156 + configure: function(config){
  157 + if(config.radius){
  158 + var rout = config.radius,
  159 + rin = parseInt(rout/2);
  160 + }
  161 + this.set("radiusIn", rin || 15),
  162 + this.set("radiusOut", rout || 40),
  163 + this.set("element", (config.element instanceof Object)?config.element:document.getElementById(config.element));
  164 + this.set("visible", config.visible);
  165 + this.set("max", config.max || false);
  166 + this.set("gradient", config.gradient || { 0.45: "rgb(0,0,255)", 0.55: "rgb(0,255,255)", 0.65: "rgb(0,255,0)", 0.95: "yellow", 1.0: "rgb(255,0,0)"}); // default is the common blue to red gradient
  167 + this.set("opacity", parseInt(255/(100/config.opacity), 10) || 180);
  168 + this.set("width", config.width || 0);
  169 + this.set("height", config.height || 0);
  170 + },
  171 + init: function(){
  172 + this.initColorPalette();
  173 + var canvas = document.createElement("canvas"),
  174 + acanvas = document.createElement("canvas"),
  175 + element = this.get("element");
  176 + this.set("canvas", canvas);
  177 + this.set("acanvas", acanvas);
  178 + canvas.width = acanvas.width = element.style.width.replace(/px/,"") || this.getWidth(element);
  179 + this.set("width", canvas.width);
  180 + canvas.height = acanvas.height = element.style.height.replace(/px/,"") || this.getHeight(element);
  181 + this.set("height", canvas.height);
  182 + canvas.style.position = acanvas.style.position = "absolute";
  183 + canvas.style.top = acanvas.style.top = "0";
  184 + canvas.style.left = acanvas.style.left = "0";
  185 + canvas.style.zIndex = 1000000;
  186 + if(!this.get("visible"))
  187 + canvas.style.display = "none";
  188 +
  189 + this.get("element").appendChild(canvas);
  190 + this.set("ctx", canvas.getContext("2d"));
  191 + this.set("actx", acanvas.getContext("2d"));
  192 + },
  193 + initColorPalette: function(){
  194 +
  195 + var canvas = document.createElement("canvas");
  196 + canvas.width = "1";
  197 + canvas.height = "256";
  198 + var ctx = canvas.getContext("2d");
  199 + var grad = ctx.createLinearGradient(0,0,1,256),
  200 + gradient = this.get("gradient");
  201 + for(var x in gradient){
  202 + grad.addColorStop(x, gradient[x]);
  203 + }
  204 +
  205 + ctx.fillStyle = grad;
  206 + ctx.fillRect(0,0,1,256);
  207 +
  208 + this.set("gradient", ctx.getImageData(0,0,1,256).data);
  209 + delete canvas;
  210 + delete grad;
  211 + delete ctx;
  212 + },
  213 + getWidth: function(element){
  214 + var width = element.offsetWidth;
  215 + if(element.style.paddingLeft)
  216 + width+=element.style.paddingLeft;
  217 + if(element.style.paddingRight)
  218 + width+=element.style.paddingRight;
  219 +
  220 + return width;
  221 + },
  222 + getHeight: function(element){
  223 + var height = element.offsetHeight;
  224 + if(element.style.paddingTop)
  225 + height+=element.style.paddingTop;
  226 + if(element.style.paddingBottom)
  227 + height+=element.style.paddingBottom;
  228 +
  229 + return height;
  230 + },
  231 + colorize: function(x, y){
  232 + // get the private variables
  233 + var width = this.get("width"),
  234 + radiusOut = this.get("radiusOut"),
  235 + height = this.get("height"),
  236 + actx = this.get("actx"),
  237 + ctx = this.get("ctx");
  238 +
  239 + var x2 = radiusOut*2;
  240 +
  241 + if(x+x2>width)
  242 + x=width-x2;
  243 + if(x<0)
  244 + x=0;
  245 + if(y<0)
  246 + y=0;
  247 + if(y+x2>height)
  248 + y=height-x2;
  249 + // get the image data for the mouse movement area
  250 + var image = actx.getImageData(x,y,x2,x2),
  251 + // some performance tweaks
  252 + imageData = image.data,
  253 + length = imageData.length,
  254 + palette = this.get("gradient"),
  255 + opacity = this.get("opacity");
  256 + // loop thru the area
  257 + for(var i=3; i < length; i+=4){
  258 +
  259 + // [0] -> r, [1] -> g, [2] -> b, [3] -> alpha
  260 + var alpha = imageData[i],
  261 + offset = alpha*4;
  262 +
  263 + if(!offset)
  264 + continue;
  265 +
  266 + // we ve started with i=3
  267 + // set the new r, g and b values
  268 + imageData[i-3]=palette[offset];
  269 + imageData[i-2]=palette[offset+1];
  270 + imageData[i-1]=palette[offset+2];
  271 + // we want the heatmap to have a gradient from transparent to the colors
  272 + // as long as alpha is lower than the defined opacity (maximum), we'll use the alpha value
  273 + imageData[i] = (alpha < opacity)?alpha:opacity;
  274 + }
  275 + // the rgb data manipulation didn't affect the ImageData object(defined on the top)
  276 + // after the manipulation process we have to set the manipulated data to the ImageData object
  277 + image.data = imageData;
  278 + ctx.putImageData(image,x,y);
  279 + },
  280 + drawAlpha: function(x, y, count){
  281 + // storing the variables because they will be often used
  282 + var r1 = this.get("radiusIn"),
  283 + r2 = this.get("radiusOut"),
  284 + ctx = this.get("actx"),
  285 + max = this.get("max"),
  286 + // create a radial gradient with the defined parameters. we want to draw an alphamap
  287 + rgr = ctx.createRadialGradient(x,y,r1,x,y,r2),
  288 + xb = x-r2, yb = y-r2, mul = 2*r2;
  289 + // the center of the radial gradient has .1 alpha value
  290 + rgr.addColorStop(0, 'rgba(0,0,0,'+((count)?(count/this.store.max):'0.1')+')');
  291 + // and it fades out to 0
  292 + rgr.addColorStop(1, 'rgba(0,0,0,0)');
  293 + // drawing the gradient
  294 + ctx.fillStyle = rgr;
  295 + ctx.fillRect(xb,yb,mul,mul);
  296 + // finally colorize the area
  297 + this.colorize(xb,yb);
  298 +
  299 + },
  300 + toggleDisplay: function(){
  301 + var visible = this.get("visible"),
  302 + canvas = this.get("canvas");
  303 +
  304 + if(!visible)
  305 + canvas.style.display = "block";
  306 + else
  307 + canvas.style.display = "none";
  308 +
  309 + this.set("visible", !visible);
  310 + },
  311 + // dataURL export
  312 + getImageData: function(){
  313 + return this.get("canvas").toDataURL();
  314 + },
  315 + clear: function(){
  316 + var w = this.get("width"),
  317 + h = this.get("height");
  318 + this.store.set("data",[]);
  319 + // @TODO: reset stores max to 1
  320 + //this.store.max = 1;
  321 + this.get("ctx").clearRect(0,0,w,h);
  322 + this.get("actx").clearRect(0,0,w,h);
  323 + }
  324 + };
  325 +
  326 + return {
  327 + create: function(config){
  328 + return new heatmap(config);
  329 + },
  330 + util: {
  331 + mousePosition: function(ev){
  332 + // this doesn't work right
  333 + // rather use
  334 + /*
  335 + // this = element to observe
  336 + var x = ev.pageX - this.offsetLeft;
  337 + var y = ev.pageY - this.offsetTop;
  338 +
  339 + */
  340 + var x, y;
  341 +
  342 + if (ev.layerX) { // Firefox
  343 + x = ev.layerX;
  344 + y = ev.layerY;
  345 + } else if (ev.offsetX) { // Opera
  346 + x = ev.offsetX;
  347 + y = ev.offsetY;
  348 + }
  349 + if(typeof(x)=='undefined')
  350 + return;
  351 +
  352 + return [x,y];
  353 + }
  354 + }
  355 + };
  356 + })();
  357 + w.h337 = w.heatmapFactory = heatmapFactory;
  358 +})(window);
1,240 heatmap_js/index.html
... ... @@ -0,0 +1,1240 @@
  1 +<!DOCTYPE html>
  2 +<html lang="en">
  3 + <head>
  4 + <meta charset="utf-8" />
  5 + <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
  6 + <title>Politimap</title>
  7 + <meta name="robots" content="index, follow" />
  8 + <meta name="description" content="HTML5 canvas heatmap based on Assemblee Nationale" />
  9 + <meta name="author" content="Alexandre Girard" />
  10 + <meta name="keywords" content="heatmap, politic, javascript, canvas, html5" />
  11 + <meta name="viewport" content="width=device-width, initial-scale=1.0">
  12 + <style>
  13 + body, html {
  14 + margin:0;
  15 + padding:0;
  16 + font-family:Arial;
  17 + }
  18 + h1 {
  19 + margin-bottom:10px;
  20 + }
  21 + #main {
  22 + position:relative;
  23 + width:940px;
  24 + padding:20px;
  25 + margin:auto;
  26 + }
  27 + #heatmapArea {
  28 + position:relative;
  29 + float:left;
  30 + width:600px;
  31 + height:400px;
  32 + background-image:url(./seat_map.jpg);
  33 + border:1px dashed black;
  34 + }
  35 + #configArea {
  36 + position:relative;
  37 + float:left;
  38 + width:260px;
  39 + padding:20px;
  40 + padding-top:0;
  41 + }
  42 + .btn {
  43 + margin-top:25px;
  44 + padding:10px 20px 10px 20px;
  45 + -moz-border-radius:15px;
  46 + -o-border-radius:15px;
  47 + -webkit-border-radius:15px;
  48 + border-radius:15px;
  49 + border:2px solid black;
  50 + cursor:pointer;
  51 + color:white;
  52 + background-color:black;
  53 + }
  54 + #gen:hover{
  55 + background-color:grey;
  56 + color:black;
  57 + }
  58 + textarea{
  59 + width:260px;
  60 + padding:10px;
  61 + height:200px;
  62 + }
  63 + h2{
  64 + margin-top:0;
  65 + }
  66 + </style>
  67 + </head>
  68 + <body>
  69 + <div id="main">
  70 + <h1>Politimap</h1>
  71 + <div id="heatmapArea">
  72 +
  73 + </div>
  74 + <div id="configArea">
  75 + <h2>Sidenotes</h2>
  76 + <div id="dataset" class="btn">Apply DataSet</div>
  77 + <div id="gen" class="btn">Generate some random data</div>
  78 + </div>
  79 + <div style="position:absolute;width:940px;top:650px;text-align:center;">
  80 + <a href="http://www.patrick-wied.at/static/heatmapjs/">heatmap.js</a> by <a href="http://www.patrick-wied.at" target="_blank">Patrick Wied</a>
  81 + </div>
  82 +
  83 + </div>
  84 + <script type="text/javascript" src="./heatmap.js"></script>
  85 + <script type="text/javascript">
  86 +
  87 +
  88 + window.onload = function(){
  89 + var xx = h337.create({"element":document.getElementById("heatmapArea"), "radius":12, "visible":true});
  90 +
  91 + xx.get("canvas").onclick = function(ev){
  92 + var pos = h337.util.mousePosition(ev);
  93 + xx.store.addDataPoint(pos[0],pos[1]);
  94 + };
  95 +
  96 + document.getElementById("dataset").onclick = function(){
  97 + var el = document.getElementById("data").value;
  98 + var obj = eval('('+el+')');
  99 +
  100 + // call the heatmap's store's setDataSet method in order to set static data
  101 + xx.store.setDataSet(obj);
  102 + };
  103 + document.getElementById("gen").onclick = function(){
  104 + xx.store.generateRandomDataSet(100);
  105 + };
  106 +
  107 + var seats = [
  108 + {id: 1, x: 410, y: 308},
  109 + {id: 2, x: 409, y: 297},
  110 + {id: 3, x: 407, y: 285},
  111 + {id: 5, x: 427, y: 309},
  112 + {id: 6, x: 426, y: 294},
  113 + {id: 7, x: 425, y: 281},
  114 + {id: 8, x: 447, y: 310},
  115 + {id: 9, x: 446, y: 298},
  116 + {id: 10, x: 445, y: 286},
  117 + {id: 11, x: 443, y: 274},
  118 + {id: 12, x: 465, y: 314},
  119 + {id: 13, x: 465, y: 302},
  120 + {id: 14, x: 464, y: 291},
  121 + {id: 15, x: 462, y: 281},
  122 + {id: 16, x: 460, y: 270},
  123 + {id: 17, x: 482, y: 317},
  124 + {id: 18, x: 482, y: 306},
  125 + {id: 19, x: 481, y: 296},
  126 + {id: 20, x: 480, y: 285},
  127 + {id: 21, x: 478, y: 274},
  128 + {id: 22, x: 475, y: 265},
  129 + {id: 23, x: 507, y: 330},
  130 + {id: 24, x: 508, y: 316},
  131 + {id: 25, x: 508, y: 305},
  132 + {id: 26, x: 508, y: 293},
  133 + {id: 27, x: 506, y: 273},
  134 + {id: 28, x: 503, y: 262},
  135 + {id: 30, x: 525, y: 330},
  136 + {id: 31, x: 526, y: 318},
  137 + {id: 32, x: 526, y: 305},
  138 + {id: 33, x: 525, y: 292},
  139 + {id: 35, x: 523, y: 270},
  140 + {id: 36, x: 520, y: 258},
  141 + {id: 38, x: 543, y: 332},
  142 + {id: 39, x: 544, y: 318},
  143 + {id: 40, x: 544, y: 304},
  144 + {id: 41, x: 543, y: 290},
  145 + {id: 43, x: 541, y: 272},
  146 + {id: 44, x: 540, y: 262},
  147 + {id: 45, x: 538, y: 252},
  148 + {id: 47, x: 561, y: 334},
  149 + {id: 48, x: 562, y: 323},
  150 + {id: 49, x: 563, y: 311},
  151 + {id: 50, x: 563, y: 300},
  152 + {id: 51, x: 562, y: 288},
  153 + {id: 52, x: 559, y: 268},
  154 + {id: 53, x: 557, y: 257},
  155 + {id: 54, x: 554, y: 246},
  156 + {id: 56, x: 578, y: 335},
  157 + {id: 57, x: 579, y: 322},
  158 + {id: 58, x: 579, y: 311},
  159 + {id: 59, x: 579, y: 300},
  160 + {id: 60, x: 578, y: 287},
  161 + {id: 62, x: 576, y: 265},
  162 + {id: 63, x: 574, y: 252},
  163 + {id: 64, x: 571, y: 240},
  164 + {id: 66, x: 596, y: 320},
  165 + {id: 67, x: 596, y: 310},
  166 + {id: 68, x: 596, y: 300},
  167 + {id: 70, x: 592, y: 265},
  168 + {id: 71, x: 590, y: 253},
  169 + {id: 72, x: 588, y: 243},
  170 + {id: 73, x: 586, y: 233},
  171 + {id: 75, x: 384, y: 273, count:90},
  172 + {id: 76, x: 380, y: 264, count:90},
  173 + {id: 77, x: 375, y: 255, count:90},
  174 + {id: 78, x: 402, y: 267, count:90},
  175 + {id: 79, x: 397, y: 255, count:90},
  176 + {id: 80, x: 390, y: 244, count:90},
  177 + {id: 81, x: 419, y: 263, count:90},
  178 + {id: 82, x: 415, y: 252, count:90},
  179 + {id: 83, x: 410, y: 242, count:90},
  180 + {id: 84, x: 403, y: 232, count:90},
  181 + {id: 85, x: 437, y: 259, count:90},
  182 + {id: 86, x: 432, y: 245, count:90},
  183 + {id: 87, x: 426, y: 233, count:90},
  184 + {id: 88, x: 418, y: 222, count:90},
  185 + {id: 89, x: 455, y: 254, count:90},
  186 + {id: 90, x: 450, y: 243, count:90},
  187 + {id: 91, x: 445, y: 231, count:90},
  188 + {id: 92, x: 439, y: 220, count:90},
  189 + {id: 93, x: 433, y: 209, count:90},
  190 + {id: 94, x: 470, y: 249, count:90},
  191 + {id: 95, x: 466, y: 238, count:90},
  192 + {id: 96, x: 462, y: 228, count:90},
  193 + {id: 97, x: 457, y: 218, count:90},
  194 + {id: 98, x: 451, y: 207, count:90},
  195 + {id: 99, x: 445, y: 198, count:90},
  196 + {id: 100, x: 497, y: 242, count:90},
  197 + {id: 101, x: 493, y: 231, count:90},
  198 + {id: 102, x: 488, y: 219, count:90},
  199 + {id: 103, x: 483, y: 209, count:90},
  200 + {id: 104, x: 477, y: 200, count:90},
  201 + {id: 105, x: 471, y: 191, count:90},
  202 + {id: 106, x: 464, y: 182, count:90},
  203 + {id: 108, x: 513, y: 236, count:90},
  204 + {id: 109, x: 509, y: 224, count:90},
  205 + {id: 110, x: 504, y: 213, count:90},
  206 + {id: 111, x: 498, y: 202, count:90},
  207 + {id: 112, x: 493, y: 191, count:90},
  208 + {id: 113, x: 486, y: 181, count:90},
  209 + {id: 114, x: 479, y: 170, count:90},
  210 + {id: 116, x: 531, y: 233, count:90},
  211 + {id: 117, x: 527, y: 223, count:90},
  212 + {id: 118, x: 523, y: 212, count:90},
  213 + {id: 119, x: 518, y: 202, count:90},
  214 + {id: 120, x: 514, y: 193, count:90},
  215 + {id: 122, x: 509, y: 184, count:90},
  216 + {id: 123, x: 503, y: 175, count:90},
  217 + {id: 124, x: 496, y: 166, count:90},
  218 + {id: 125, x: 489, y: 157, count:90},
  219 + {id: 126, x: 548, y: 228, count:90},
  220 + {id: 127, x: 544, y: 217, count:90},
  221 + {id: 128, x: 540, y: 206, count:90},
  222 + {id: 129, x: 535, y: 195, count:90},
  223 + {id: 130, x: 530, y: 184, count:90},
  224 + {id: 132, x: 524, y: 174, count:90},
  225 + {id: 133, x: 518, y: 164, count:90},
  226 + {id: 134, x: 512, y: 155, count:90},
  227 + {id: 135, x: 506, y: 146, count:90},
  228 + {id: 136, x: 565, y: 224, count:90},
  229 +{id: 137, x: 562, y: 214, count:90},
  230 +{id: 138, x: 559, y: 204, count:90},
  231 +{id: 139, x: 555, y: 194, count:90},
  232 +{id: 140, x: 550, y: 184, count:90},
  233 +{id: 142, x: 545, y: 174, count:90},
  234 +{id: 143, x: 540, y: 165, count:90},
  235 +{id: 144, x: 535, y: 155, count:90},
  236 +{id: 145, x: 529, y: 147, count:90},
  237 +{id: 146, x: 523, y: 139, count:90},
  238 +{id: 147, x: 516, y: 132, count:90},
  239 +{id: 148, x: 581, y: 219, count:90},
  240 +{id: 149, x: 577, y: 208, count:90},
  241 +{id: 150, x: 574, y: 197, count:90},
  242 +{id: 151, x: 570, y: 187, count:90},
  243 +{id: 152, x: 565, y: 176, count:90},
  244 +{id: 153, x: 560, y: 166, count:90},
  245 +{id: 154, x: 554, y: 157, count:90},
  246 +{id: 155, x: 548, y: 148, count:90},
  247 +{id: 156, x: 543, y: 140, count:90},
  248 +{id: 157, x: 536, y: 132, count:90},
  249 +{id: 158, x: 529, y: 123, count:90},
  250 +
  251 +{id: 162, x: 362, y: 241, count:90},
  252 +{id: 163, x: 355, y: 234, count:90},
  253 +{id: 164, x: 346, y: 229, count:90},
  254 +{id: 165, x: 377, y: 229, count:90},
  255 +{id: 166, x: 365, y: 220, count:90},
  256 +{id: 167, x: 353, y: 212, count:90},
  257 +{id: 168, x: 388, y: 216, count:90},
  258 +{id: 169, x: 379, y: 209, count:90},
  259 +{id: 170, x: 370, y: 202, count:90},
  260 +{id: 171, x: 360, y: 196, count:90},
  261 +{id: 172, x: 402, y: 206, count:90},
  262 +{id: 173, x: 392, y: 197, count:90},
  263 +{id: 174, x: 380, y: 188, count:90},
  264 +{id: 175, x: 369, y: 181, count:90},
  265 +{id: 176, x: 417, y: 194, count:90},
  266 +{id: 177, x: 408, y: 185, count:90},
  267 +{id: 178, x: 398, y: 176, count:90},
  268 +{id: 179, x: 387, y: 169, count:90},
  269 +{id: 180, x: 376, y: 163, count:90},
  270 +{id: 181, x: 431, y: 183, count:90},
  271 +{id: 182, x: 422, y: 174, count:90},
  272 +{id: 183, x: 413, y: 166, count:90},
  273 +{id: 184, x: 403, y: 159, count:90},
  274 +{id: 185, x: 392, y: 153, count:90},
  275 +{id: 186, x: 381, y: 147, count:90},
  276 +{id: 187, x: 452, y: 166, count:90},
  277 +{id: 188, x: 443, y: 157, count:90},
  278 +{id: 189, x: 435, y: 149, count:90},
  279 +{id: 190, x: 425, y: 141, count:90},
  280 +{id: 191, x: 415, y: 134, count:90},
  281 +{id: 192, x: 404, y: 128, count:90},
  282 +{id: 193, x: 394, y: 123, count:90},
  283 +{id: 195, x: 464, y: 153, count:90},
  284 +{id: 196, x: 453, y: 143, count:90},
  285 +{id: 197, x: 443, y: 134, count:90},
  286 +{id: 198, x: 430, y: 125, count:90},
  287 +{id: 199, x: 420, y: 119, count:90},
  288 +{id: 200, x: 410, y: 113, count:90},
  289 +{id: 201, x: 400, y: 108, count:90},
  290 +{id: 203, x: 478, y: 143, count:90},
  291 +{id: 204, x: 469, y: 135, count:90},
  292 +{id: 205, x: 461, y: 128, count:90},
  293 +{id: 206, x: 453, y: 121, count:90},
  294 +{id: 207, x: 444, y: 113, count:90},
  295 +{id: 209, x: 435, y: 107, count:90},
  296 +{id: 210, x: 426, y: 102, count:90},
  297 +{id: 211, x: 417, y: 97, count:90},
  298 +{id: 212, x: 407, y: 93, count:90},
  299 +{id: 213, x: 491, y: 130, count:90},
  300 +{id: 214, x: 482, y: 122, count:90},
  301 +{id: 215, x: 474, y: 114, count:90},
  302 +{id: 216, x: 465, y: 106, count:90},
  303 +{id: 217, x: 456, y: 98, count:90},
  304 +{id: 219, x: 446, y: 92, count:90},
  305 +{id: 220, x: 436, y: 86, count:90},
  306 +{id: 221, x: 425, y: 79, count:90},
  307 +{id: 222, x: 415, y: 74, count:90},
  308 +{id: 223, x: 506, y: 121, count:90},
  309 +{id: 224, x: 499, y: 113, count:90},
  310 +{id: 225, x: 491, y: 105, count:90},
  311 +{id: 226, x: 483, y: 97, count:90},
  312 +{id: 227, x: 475, y: 91, count:90},
  313 +{id: 228, x: 466, y: 84, count:90},
  314 +{id: 230, x: 458, y: 78, count:90},
  315 +{id: 231, x: 450, y: 72, count:90},
  316 +{id: 232, x: 441, y: 67, count:90},
  317 +{id: 233, x: 433, y: 62, count:90},
  318 +{id: 234, x: 425, y: 58, count:90},
  319 +{id: 235, x: 519, y: 110, count:90},
  320 +{id: 236, x: 510, y: 101, count:90},
  321 +{id: 237, x: 501, y: 93, count:90},
  322 +{id: 238, x: 492, y: 84, count:90},
  323 +{id: 239, x: 484, y: 77, count:90},
  324 +{id: 240, x: 476, y: 70, count:90},
  325 +{id: 241, x: 468, y: 64, count:90},
  326 +{id: 242, x: 460, y: 59, count:90},
  327 +{id: 243, x: 450, y: 53, count:90},
  328 +{id: 244, x: 440, y: 48, count:90},
  329 +{id: 245, x: 430, y: 43, count:90},
  330 +{id: 248, x: 345, y: 188, count:90},
  331 +{id: 249, x: 333, y: 184, count:90},
  332 +{id: 250, x: 321, y: 181, count:90},
  333 +{id: 251, x: 309, y: 180, count:90},
  334 +{id: 253, x: 351, y: 170, count:90},
  335 +{id: 254, x: 337, y: 166, count:90},
  336 +{id: 255, x: 324, y: 164, count:90},
  337 +{id: 256, x: 311, y: 162, count:90},
  338 +{id: 257, x: 361, y: 155, count:90},
  339 +{id: 258, x: 347, y: 151, count:90},
  340 +{id: 259, x: 335, y: 148, count:90},
  341 +{id: 260, x: 323, y: 146, count:90},
  342 +{id: 261, x: 310, y: 145, count:90},
  343 +{id: 262, x: 367, y: 140, count:90},
  344 +{id: 263, x: 355, y: 136, count:90},
  345 +{id: 264, x: 343, y: 132, count:90},
  346 +{id: 265, x: 332, y: 130, count:90},
  347 +{id: 266, x: 321, y: 128, count:90},
  348 +{id: 267, x: 309, y: 127, count:90},
  349 +{id: 268, x: 379, y: 115, count:90},
  350 +{id: 269, x: 367, y: 111, count:90},
  351 +{id: 270, x: 356, y: 107, count:90},
  352 +{id: 271, x: 344, y: 104, count:90},
  353 +{id: 272, x: 332, y: 102, count:90},
  354 +{id: 273, x: 321, y: 101, count:90},
  355 +{id: 274, x: 309, y: 101, count:90},
  356 +{id: 276, x: 386, y: 100, count:90},
  357 +{id: 277, x: 373, y: 95, count:90},
  358 +{id: 278, x: 361, y: 91, count:90},
  359 +{id: 279, x: 348, y: 88, count:90},
  360 +{id: 280, x: 335, y: 85, count:90},
  361 +{id: 281, x: 322, y: 84, count:90},
  362 +{id: 282, x: 309, y: 83, count:90},
  363 +{id: 284, x: 395, y: 84, count:90},
  364 +{id: 285, x: 384, y: 80, count:90},
  365 +{id: 286, x: 374, y: 76, count:90},
  366 +{id: 287, x: 363, y: 73, count:90},
  367 +{id: 288, x: 352, y: 70, count:90},
  368 +{id: 290, x: 341, y: 68, count:90},
  369 +{id: 291, x: 330, y: 66, count:90},
  370 +{id: 292, x: 319, y: 65, count:90},
  371 +{id: 293, x: 308, y: 64, count:90},
  372 +{id: 294, x: 400, y: 66, count:90},
  373 +{id: 295, x: 390, y: 62, count:90},
  374 +{id: 296, x: 379, y: 59, count:90},
  375 +{id: 297, x: 368, y: 56, count:90},
  376 +{id: 298, x: 356, y: 53, count:90},
  377 +{id: 300, x: 344, y: 50, count:90},
  378 +{id: 301, x: 332, y: 48, count:90},
  379 +{id: 302, x: 320, y: 47, count:90},
  380 +{id: 303, x: 308, y: 47, count:90},
  381 +{id: 304, x: 408, y: 51, count:90},
  382 +{id: 305, x: 398, y: 47, count:90},
  383 +{id: 306, x: 388, y: 44, count:90},
  384 +{id: 307, x: 378, y: 41, count:90},
  385 +{id: 308, x: 368, y: 38, count:90},
  386 +{id: 309, x: 358, y: 36, count:90},
  387 +{id: 311, x: 348, y: 34, count:90},
  388 +{id: 312, x: 338, y: 32, count:90},
  389 +{id: 313, x: 328, y: 31, count:90},
  390 +{id: 314, x: 318, y: 30, count:90},
  391 +{id: 315, x: 308, y: 30, count:90},
  392 +{id: 317, x: 414, y: 37, count:90},
  393 +{id: 318, x: 403, y: 32, count:90},
  394 +{id: 319, x: 392, y: 28, count:90},
  395 +{id: 320, x: 380, y: 24, count:90},
  396 +{id: 321, x: 370, y: 21, count:90},
  397 +{id: 322, x: 360, y: 19, count:90},
  398 +{id: 323, x: 349, y: 17, count:90},
  399 +{id: 324, x: 339, y: 15, count:90},
  400 +{id: 325, x: 329, y: 14, count:90},
  401 +{id: 326, x: 318, y: 13, count:90},
  402 +{id: 327, x: 308, y: 13, count:90},
  403 +{id: 329, x: 292, y: 181, count:90},
  404 +{id: 330, x: 280, y: 182, count:90},
  405 +{id: 331, x: 267, y: 185, count:90},
  406 +{id: 332, x: 255, y: 188, count:90},
  407 +{id: 333, x: 292, y: 160, count:90},
  408 +{id: 334, x: 277, y: 162, count:90},
  409 +{id: 335, x: 263, y: 165, count:90},
  410 +{id: 336, x: 248, y: 170, count:90},
  411 +{id: 337, x: 293, y: 143, count:90},
  412 +{id: 338, x: 279, y: 145, count:90},
  413 +{id: 339, x: 265, y: 147, count:90},
  414 +{id: 340, x: 252, y: 150, count:90},
  415 +{id: 341, x: 240, y: 154, count:90},
  416 +{id: 342, x: 292, y: 126, count:90},
  417 +{id: 343, x: 280, y: 128, count:90},
  418 +{id: 344, x: 268, y: 130, count:90},
  419 +{id: 345, x: 255, y: 132, count:90},
  420 +{id: 346, x: 244, y: 135, count:90},
  421 +{id: 347, x: 233, y: 139, count:90},
  422 +{id: 348, x: 292, y: 100, count:90},
  423 +{id: 349, x: 279, y: 100, count:90},
  424 +{id: 350, x: 266, y: 102, count:90},
  425 +{id: 351, x: 255, y: 104, count:90},
  426 +{id: 352, x: 242, y: 107, count:90},
  427 +{id: 353, x: 231, y: 111, count:90},
  428 +{id: 354, x: 220, y: 115, count:90},
  429 +{id: 356, x: 293, y: 82, count:90},
  430 +{id: 357, x: 279, y: 83, count:90},
  431 +{id: 358, x: 265, y: 85, count:90},
  432 +{id: 359, x: 251, y: 87, count:90},
  433 +{id: 360, x: 238, y: 91, count:90},
  434 +{id: 361, x: 226, y: 95, count:90},
  435 +{id: 362, x: 214, y: 100, count:90},
  436 +{id: 364, x: 294, y: 64, count:90},
  437 +{id: 365, x: 283, y: 64, count:90},
  438 +{id: 366, x: 272, y: 65, count:90},
  439 +{id: 367, x: 261, y: 67, count:90},
  440 +{id: 368, x: 250, y: 69, count:90},
  441 +{id: 370, x: 239, y: 71, count:90},
  442 +{id: 371, x: 228, y: 74, count:90},
  443 +{id: 372, x: 217, y: 78, count:90},
  444 +{id: 373, x: 206, y: 82, count:90},
  445 +{id: 374, x: 294, y: 46, count:90},
  446 +{id: 375, x: 282, y: 47, count:90},
  447 +{id: 376, x: 270, y: 48, count:90},
  448 +{id: 377, x: 258, y: 49, count:90},
  449 +{id: 378, x: 246, y: 51, count:90},
  450 +{id: 380, x: 234, y: 54, count:90},
  451 +{id: 381, x: 222, y: 58, count:90},
  452 +{id: 382, x: 210, y: 62, count:90},
  453 +{id: 383, x: 198, y: 67, count:90},
  454 +{id: 384, x: 294, y: 29, count:90},
  455 +{id: 385, x: 283, y: 30, count:90},
  456 +{id: 386, x: 272, y: 31, count:90},
  457 +{id: 387, x: 261, y: 32, count:90},
  458 +{id: 388, x: 250, y: 34, count:90},
  459 +{id: 389, x: 239, y: 36, count:90},
  460 +{id: 391, x: 230, y: 38, count:90},
  461 +{id: 392, x: 220, y: 41, count:90},
  462 +{id: 393, x: 210, y: 44, count:90},
  463 +{id: 394, x: 200, y: 47, count:90},
  464 +{id: 395, x: 190, y: 51, count:90},
  465 +{id: 397, x: 294, y: 14, count:90},
  466 +{id: 398, x: 282, y: 14, count:90},
  467 +{id: 399, x: 270, y: 15, count:90},
  468 +{id: 400, x: 258, y: 16, count:90},
  469 +{id: 401, x: 246, y: 18, count:90},
  470 +{id: 402, x: 235, y: 20, count:90},
  471 +{id: 403, x: 225, y: 23, count:90},
  472 +{id: 404, x: 215, y: 26, count:90},
  473 +{id: 405, x: 205, y: 29, count:90},
  474 +{id: 406, x: 195, y: 32, count:90},
  475 +{id: 407, x: 185, y: 36, count:90},
  476 +{id: 409, x: 237, y: 196, count:90},
  477 +{id: 410, x: 228, y: 202, count:90},
  478 +{id: 411, x: 219, y: 209, count:90},
  479 +{id: 412, x: 209, y: 217, count:90},
  480 +{id: 413, x: 231, y: 179, count:90},
  481 +{id: 414, x: 219, y: 186, count:90},
  482 +{id: 415, x: 208, y: 194, count:90},
  483 +{id: 416, x: 197, y: 205, count:90},
  484 +{id: 417, x: 222, y: 163, count:90},
  485 +{id: 418, x: 211, y: 169, count:90},
  486 +{id: 419, x: 200, y: 176, count:90},
  487 +{id: 420, x: 190, y: 185, count:90},
  488 +{id: 421, x: 181, y: 194, count:90},
  489 +{id: 422, x: 216, y: 147, count:90},
  490 +{id: 423, x: 206, y: 153, count:90},
  491 +{id: 424, x: 197, y: 159, count:90},
  492 +{id: 425, x: 187, y: 166, count:90},
  493 +{id: 426, x: 177, y: 174, count:90},
  494 +{id: 427, x: 168, y: 183, count:90},
  495 +{id: 428, x: 206, y: 121, count:90},
  496 +{id: 429, x: 196, y: 126, count:90},
  497 +{id: 430, x: 186, y: 133, count:90},
  498 +{id: 431, x: 175, y: 140, count:90},
  499 +{id: 432, x: 165, y: 149, count:90},
  500 +{id: 433, x: 155, y: 157, count:90},
  501 +{id: 434, x: 146, y: 166, count:90},
  502 +{id: 436, x: 198, y: 106, count:90},
  503 +{id: 437, x: 188, y: 111, count:90},
  504 +{id: 438, x: 177, y: 118, count:90},
  505 +{id: 439, x: 166, y: 126, count:90},
  506 +{id: 440, x: 155, y: 135, count:90},
  507 +{id: 441, x: 144, y: 145, count:90},
  508 +{id: 442, x: 134, y: 155, count:90},
  509 +{id: 444, x: 192, y: 90, count:90},
  510 +{id: 445, x: 183, y: 95, count:90},
  511 +{id: 446, x: 172, y: 101, count:90},
  512 +{id: 447, x: 162, y: 108, count:90},
  513 +{id: 448, x: 153, y: 114, count:90},
  514 +{id: 450, x: 144, y: 121, count:90},
  515 +{id: 451, x: 136, y: 128, count:90},
  516 +{id: 452, x: 128, y: 135, count:90},
  517 +{id: 453, x: 120, y: 143, count:90},
  518 +{id: 454, x: 184, y: 73, count:90},
  519 +{id: 455, x: 173, y: 79, count:90},
  520 +{id: 456, x: 162, y: 86, count:90},
  521 +{id: 457, x: 151, y: 93, count:90},
  522 +{id: 458, x: 141, y: 100, count:90},
  523 +{id: 460, x: 132, y: 108, count:90},
  524 +{id: 461, x: 123, y: 116, count:90},
  525 +{id: 462, x: 114, y: 125, count:90},
  526 +{id: 463, x: 105, y: 133, count:90},
  527 +{id: 464, x: 176, y: 58, count:90},
  528 +{id: 465, x: 166, y: 63, count:90},
  529 +{id: 466, x: 156, y: 69, count:90},
  530 +{id: 467, x: 148, y: 74, count:90},
  531 +{id: 468, x: 140, y: 80, count:90},
  532 +{id: 469, x: 132, y: 86, count:90},
  533 +{id: 471, x: 123, y: 92, count:90},
  534 +{id: 472, x: 115, y: 98, count:90},
  535 +{id: 473, x: 107, y: 106, count:90},
  536 +{id: 474, x: 100, y: 114, count:90},
  537 +{id: 475, x: 93, y: 122, count:90},
  538 +{id: 478, x: 169, y: 44, count:90},
  539 +{id: 479, x: 160, y: 48, count:90},
  540 +{id: 480, x: 151, y: 53, count:90},
  541 +{id: 481, x: 142, y: 58, count:90},
  542 +{id: 482, x: 133, y: 64, count:90},
  543 +{id: 483, x: 125, y: 71, count:90},
  544 +{id: 484, x: 116, y: 77, count:90},
  545 +{id: 485, x: 106, y: 85, count:90},
  546 +{id: 486, x: 98, y: 92, count:90},
  547 +{id: 487, x: 90, y: 101, count:90},
  548 +{id: 488, x: 80, y: 110, count:90},
  549 +{id: 489, x: 227, y: 254, count:90},
  550 +{id: 490, x: 221, y: 264, count:90},
  551 +{id: 491, x: 217, y: 274, count:90},
  552 +{id: 492, x: 213, y: 243, count:90},
  553 +{id: 493, x: 205, y: 255, count:90},
  554 +{id: 494, x: 198, y: 268, count:90},
  555 +{id: 495, x: 199, y: 232, count:90},
  556 +{id: 496, x: 191, y: 241, count:90},
  557 +{id: 497, x: 185, y: 253, count:90},
  558 +{id: 498, x: 180, y: 264, count:90},
  559 +{id: 499, x: 183, y: 221, count:90},
  560 +{id: 500, x: 175, y: 232, count:90},
  561 +{id: 501, x: 167, y: 246, count:90},
  562 +{id: 502, x: 162, y: 259, count:90},
  563 +{id: 503, x: 170, y: 208, count:90},
  564 +{id: 504, x: 162, y: 218, count:90},
  565 +{id: 505, x: 155, y: 229, count:90},
  566 +{id: 506, x: 148, y: 241, count:90},
  567 +{id: 507, x: 144, y: 253, count:90},
  568 +{id: 508, x: 157, y: 197, count:90},
  569 +{id: 509, x: 149, y: 206, count:90},
  570 +{id: 510, x: 142, y: 216, count:90},
  571 +{id: 511, x: 137, y: 226, count:90},
  572 +{id: 512, x: 132, y: 238, count:90},
  573 +{id: 513, x: 128, y: 249, count:90},
  574 +{id: 514, x: 136, y: 179, count:90},
  575 +{id: 515, x: 129, y: 188, count:90},
  576 +{id: 516, x: 123, y: 197, count:90},
  577 +{id: 517, x: 118, y: 207, count:90},
  578 +{id: 518, x: 111, y: 219, count:90},
  579 +{id: 519, x: 106, y: 230, count:90},
  580 +{id: 520, x: 102, y: 241, count:90},
  581 +{id: 522, x: 123, y: 168, count:90},
  582 +{id: 523, x: 116, y: 178, count:90},
  583 +{id: 524, x: 109, y: 188, count:90},
  584 +{id: 525, x: 102, y: 199, count:90},
  585 +{id: 526, x: 95, y: 211, count:90},
  586 +{id: 527, x: 90, y: 224, count:90},
  587 +{id: 528, x: 86, y: 237, count:90},
  588 +{id: 530, x: 109, y: 156, count:90},
  589 +{id: 531, x: 103, y: 165, count:90},
  590 +{id: 532, x: 96, y: 174, count:90},
  591 +{id: 533, x: 90, y: 183, count:90},
  592 +{id: 534, x: 84, y: 193, count:90},
  593 +{id: 536, x: 79, y: 204, count:90},
  594 +{id: 537, x: 75, y: 214, count:90},
  595 +{id: 538, x: 71, y: 223, count:90},
  596 +{id: 539, x: 68, y: 233, count:90},
  597 +{id: 540, x: 96, y: 144, count:90},
  598 +{id: 541, x: 90, y: 153, count:90},
  599 +{id: 542, x: 83, y: 163, count:90},
  600 +{id: 543, x: 77, y: 172, count:90},
  601 +{id: 544, x: 72, y: 182, count:90},
  602 +{id: 545, x: 66, y: 193, count:90},
  603 +{id: 546, x: 61, y: 203, count:90},
  604 +{id: 547, x: 57, y: 213, count:90},
  605 +{id: 548, x: 54, y: 222, count:90},
  606 +{id: 549, x: 51, y: 231, count:90},
  607 +{id: 550, x: 82, y: 134, count:90},
  608 +{id: 551, x: 76, y: 143, count:90},
  609 +{id: 552, x: 70, y: 152, count:90},
  610 +{id: 553, x: 64, y: 160, count:90},
  611 +{id: 554, x: 59, y: 168, count:90},
  612 +{id: 555, x: 54, y: 176, count:90},
  613 +{id: 557, x: 50, y: 185, count:90},
  614 +{id: 558, x: 46, y: 194, count:90},
  615 +{id: 559, x: 42, y: 204, count:90},
  616 +{id: 560, x: 37, y: 215, count:90},
  617 +{id: 561, x: 33, y: 226, count:90},
  618 +{id: 564, x: 71, y: 122, count:90},
  619 +{id: 565, x: 64, y: 132, count:90},
  620 +{id: 566, x: 56, y: 142, count:90},
  621 +{id: 567, x: 50, y: 152, count:90},
  622 +{id: 568, x: 44, y: 162, count:90},
  623 +{id: 569, x: 39, y: 172, count:90},
  624 +{id: 570, x: 34, y: 182, count:90},
  625 +{id: 571, x: 29, y: 192, count:90},
  626 +{id: 572, x: 24, y: 202, count:90},
  627 +{id: 573, x: 21, y: 212, count:90},
  628 +{id: 574, x: 19, y: 222, count:90},
  629 +{id: 576, x: 193, y: 286, count:90},
  630 +{id: 577, x: 192, y: 298, count:90},
  631 +{id: 578, x: 191, y: 310, count:90},
  632 +{id: 580, x: 175, y: 282, count:90},
  633 +{id: 581, x: 174, y: 295, count:90},
  634 +{id: 582, x: 173, y: 308, count:90},
  635 +{id: 583, x: 157, y: 276, count:90},
  636 +{id: 584, x: 156, y: 287, count:90},
  637 +{id: 585, x: 155, y: 298, count:90},
  638 +{id: 586, x: 154, y: 309, count:90},
  639 +{id: 587, x: 140, y: 271, count:90},
  640 +{id: 588, x: 138, y: 282, count:90},
  641 +{id: 589, x: 137, y: 293, count:90},
  642 +{id: 590, x: 137, y: 304, count:90},
  643 +{id: 591, x: 137, y: 315, count:90},
  644 +{id: 592, x: 123, y: 266, count:90},
  645 +{id: 593, x: 122, y: 276, count:90},
  646 +{id: 594, x: 121, y: 286, count:90},
  647 +{id: 595, x: 120, y: 296, count:90},
  648 +{id: 596, x: 119, y: 306, count:90},
  649 +{id: 597, x: 119, y: 316, count:90},
  650 +{id: 599, x: 96, y: 260, count:90},
  651 +{id: 600, x: 94, y: 271, count:90},
  652 +{id: 601, x: 92, y: 293, count:90},
  653 +{id: 602, x: 92, y: 305, count:90},
  654 +{id: 603, x: 92, y: 317, count:90},
  655 +{id: 604, x: 92, y: 329, count:90},
  656 +{id: 606, x: 81, y: 257, count:90},
  657 +{id: 607, x: 78, y: 269, count:90},
  658 +{id: 609, x: 76, y: 291, count:90},
  659 +{id: 610, x: 75, y: 305, count:90},
  660 +{id: 611, x: 75, y: 318, count:90},
  661 +{id: 612, x: 76, y: 331, count:90},
  662 +{id: 614, x: 63, y: 250, count:90},
  663 +{id: 615, x: 61, y: 260, count:90},
  664 +{id: 616, x: 60, y: 271, count:90},
  665 +{id: 618, x: 58, y: 289, count:90},
  666 +{id: 619, x: 58, y: 303, count:90},
  667 +{id: 620, x: 58, y: 317, count:90},
  668 +{id: 621, x: 58, y: 331, count:90},
  669 +{id: 623, x: 46, y: 247, count:90},
  670 +{id: 624, x: 44, y: 258, count:90},
  671 +{id: 625, x: 42, y: 269, count:90},
  672 +{id: 626, x: 40, y: 288, count:90},
  673 +{id: 627, x: 40, y: 299, count:90},
  674 +{id: 628, x: 40, y: 310, count:90},
  675 +{id: 629, x: 40, y: 321, count:90},
  676 +{id: 630, x: 41, y: 332, count:90},
  677 +{id: 632, x: 29, y: 243, count:90},
  678 +{id: 633, x: 26, y: 254, count:90},
  679 +{id: 634, x: 24, y: 265, count:90},
  680 +{id: 636, x: 24, y: 284, count:90},
  681 +{id: 637, x: 23, y: 296, count:90},
  682 +{id: 638, x: 23, y: 309, count:90},
  683 +{id: 639, x: 23, y: 322, count:90},
  684 +{id: 640, x: 24, y: 335, count:90},
  685 +{id: 642, x: 14, y: 236, count:90},
  686 +{id: 643, x: 11, y: 246, count:90},
  687 +{id: 644, x: 10, y: 256, count:90},
  688 +{id: 645, x: 8, y: 266, count:90},
  689 +{id: 648, x: 5, y: 300, count:90},
  690 +{id: 649, x: 5, y: 311, count:90},
  691 +{id: 650, x: 6, y: 322, count:90},
  692 +
  693 + ]
  694 +
  695 + var test = { max: 90, data: [
  696 + {x: 410, y: 308, count: 90},
  697 + {x: 409, y: 297, count: 60},
  698 +
  699 + {id: 30, x: 525, y: 330, count: 90},
  700 + {id: 31, x: 526, y: 318, count: 90},
  701 + {id: 32, x: 526, y: 305, count: 90},
  702 + {id: 33, x: 525, y: 292, count: 90},
  703 + {id: 35, x: 523, y: 270, count: 90},
  704 + {id: 36, x: 520, y: 258, count: 90},
  705 +
  706 + {id: 75, x: 384, y: 273, count:90},
  707 + {id: 76, x: 380, y: 264, count:90},
  708 + {id: 77, x: 375, y: 255, count:90},
  709 + {id: 78, x: 402, y: 267, count:90},
  710 + {id: 79, x: 397, y: 255, count:90},
  711 + {id: 80, x: 390, y: 244, count:90},
  712 + {id: 81, x: 419, y: 263, count:90},
  713 + {id: 82, x: 415, y: 252, count:90},
  714 + {id: 83, x: 410, y: 242, count:90},
  715 + {id: 84, x: 403, y: 232, count:90},
  716 + {id: 85, x: 437, y: 259, count:90},
  717 + {id: 86, x: 432, y: 245, count:90},
  718 + {id: 87, x: 426, y: 233, count:90},
  719 + {id: 88, x: 418, y: 222, count:90},
  720 + {id: 89, x: 455, y: 254, count:90},
  721 + {id: 90, x: 450, y: 243, count:90},
  722 + {id: 91, x: 445, y: 231, count:90},
  723 + {id: 92, x: 439, y: 220, count:90},
  724 + {id: 93, x: 433, y: 209, count:90},
  725 + {id: 94, x: 470, y: 249, count:90},
  726 + {id: 95, x: 466, y: 238, count:90},
  727 + {id: 96, x: 462, y: 228, count:90},
  728 + {id: 97, x: 457, y: 218, count:90},
  729 + {id: 98, x: 451, y: 207, count:90},
  730 + {id: 99, x: 445, y: 198, count:90},
  731 + {id: 100, x: 497, y: 242, count:90},
  732 + {id: 101, x: 493, y: 231, count:90},
  733 + {id: 102, x: 488, y: 219, count:90},
  734 + {id: 103, x: 483, y: 209, count:90},
  735 + {id: 104, x: 477, y: 200, count:90},
  736 + {id: 105, x: 471, y: 191, count:90},
  737 + {id: 106, x: 464, y: 182, count:90},
  738 + {id: 108, x: 513, y: 236, count:90},
  739 + {id: 109, x: 509, y: 224, count:90},
  740 + {id: 110, x: 504, y: 213, count:90},
  741 + {id: 111, x: 498, y: 202, count:90},
  742 + {id: 112, x: 493, y: 191, count:90},
  743 + {id: 113, x: 486, y: 181, count:90},
  744 + {id: 114, x: 479, y: 170, count:90},
  745 + {id: 116, x: 531, y: 233, count:90},
  746 + {id: 117, x: 527, y: 223, count:90},
  747 + {id: 118, x: 523, y: 212, count:90},
  748 + {id: 119, x: 518, y: 202, count:90},
  749 + {id: 120, x: 514, y: 193, count:90},
  750 + {id: 122, x: 509, y: 184, count:90},
  751 + {id: 123, x: 503, y: 175, count:90},
  752 + {id: 124, x: 496, y: 166, count:90},
  753 + {id: 125, x: 489, y: 157, count:90},
  754 + {id: 126, x: 548, y: 228, count:90},
  755 + {id: 127, x: 544, y: 217, count:90},
  756 + {id: 128, x: 540, y: 206, count:90},
  757 + {id: 129, x: 535, y: 195, count:90},
  758 + {id: 130, x: 530, y: 184, count:90},
  759 + {id: 132, x: 524, y: 174, count:90},
  760 + {id: 133, x: 518, y: 164, count:90},
  761 + {id: 134, x: 512, y: 155, count:90},
  762 + {id: 135, x: 506, y: 146, count:90},
  763 + {id: 136, x: 565, y: 224, count:90},
  764 +{id: 137, x: 562, y: 214, count:90},
  765 +{id: 138, x: 559, y: 204, count:90},
  766 +{id: 139, x: 555, y: 194, count:90},
  767 +{id: 140, x: 550, y: 184, count:90},
  768 +{id: 142, x: 545, y: 174, count:90},
  769 +{id: 143, x: 540, y: 165, count:90},
  770 +{id: 144, x: 535, y: 155, count:90},
  771 +{id: 145, x: 529, y: 147, count:90},
  772 +{id: 146, x: 523, y: 139, count:90},
  773 +{id: 147, x: 516, y: 132, count:90},
  774 +{id: 148, x: 581, y: 219, count:90},
  775 +{id: 149, x: 577, y: 208, count:90},
  776 +{id: 150, x: 574, y: 197, count:90},
  777 +{id: 151, x: 570, y: 187, count:90},
  778 +{id: 152, x: 565, y: 176, count:90},
  779 +{id: 153, x: 560, y: 166, count:90},
  780 +{id: 154, x: 554, y: 157, count:90},
  781 +{id: 155, x: 548, y: 148, count:90},
  782 +{id: 156, x: 543, y: 140, count:90},
  783 +{id: 157, x: 536, y: 132, count:90},
  784 +{id: 158, x: 529, y: 123, count:90},
  785 +
  786 +{id: 162, x: 362, y: 241, count:90},
  787 +{id: 163, x: 355, y: 234, count:90},
  788 +{id: 164, x: 346, y: 229, count:90},
  789 +{id: 165, x: 377, y: 229, count:90},
  790 +{id: 166, x: 365, y: 220, count:90},
  791 +{id: 167, x: 353, y: 212, count:90},
  792 +{id: 168, x: 388, y: 216, count:90},
  793 +{id: 169, x: 379, y: 209, count:90},
  794 +{id: 170, x: 370, y: 202, count:90},
  795 +{id: 171, x: 360, y: 196, count:90},
  796 +{id: 172, x: 402, y: 206, count:90},
  797 +{id: 173, x: 392, y: 197, count:90},
  798 +{id: 174, x: 380, y: 188, count:90},
  799 +{id: 175, x: 369, y: 181, count:90},
  800 +{id: 176, x: 417, y: 194, count:90},
  801 +{id: 177, x: 408, y: 185, count:90},
  802 +{id: 178, x: 398, y: 176, count:90},
  803 +{id: 179, x: 387, y: 169, count:90},
  804 +{id: 180, x: 376, y: 163, count:90},
  805 +{id: 181, x: 431, y: 183, count:90},
  806 +{id: 182, x: 422, y: 174, count:90},
  807 +{id: 183, x: 413, y: 166, count:90},
  808 +{id: 184, x: 403, y: 159, count:90},
  809 +{id: 185, x: 392, y: 153, count:90},
  810 +{id: 186, x: 381, y: 147, count:90},
  811 +{id: 187, x: 452, y: 166, count:90},
  812 +{id: 188, x: 443, y: 157, count:90},
  813 +{id: 189, x: 435, y: 149, count:90},
  814 +{id: 190, x: 425, y: 141, count:90},
  815 +{id: 191, x: 415, y: 134, count:90},
  816 +{id: 192, x: 404, y: 128, count:90},
  817 +{id: 193, x: 394, y: 123, count:90},
  818 +{id: 195, x: 464, y: 153, count:90},
  819 +{id: 196, x: 453, y: 143, count:90},
  820 +{id: 197, x: 443, y: 134, count:90},
  821 +{id: 198, x: 430, y: 125, count:90},
  822 +{id: 199, x: 420, y: 119, count:90},
  823 +{id: 200, x: 410, y: 113, count:90},
  824 +{id: 201, x: 400, y: 108, count:90},
  825 +{id: 203, x: 478, y: 143, count:90},
  826 +{id: 204, x: 469, y: 135, count:90},
  827 +{id: 205, x: 461, y: 128, count:90},
  828 +{id: 206, x: 453, y: 121, count:90},
  829 +{id: 207, x: 444, y: 113, count:90},
  830 +{id: 209, x: 435, y: 107, count:90},
  831 +{id: 210, x: 426, y: 102, count:90},
  832 +{id: 211, x: 417, y: 97, count:90},
  833 +{id: 212, x: 407, y: 93, count:90},
  834 +{id: 213, x: 491, y: 130, count:90},
  835 +{id: 214, x: 482, y: 122, count:90},
  836 +{id: 215, x: 474, y: 114, count:90},
  837 +{id: 216, x: 465, y: 106, count:90},
  838 +{id: 217, x: 456, y: 98, count:90},
  839 +{id: 219, x: 446, y: 92, count:90},
  840 +{id: 220, x: 436, y: 86, count:90},
  841 +{id: 221, x: 425, y: 79, count:90},
  842 +{id: 222, x: 415, y: 74, count:90},
  843 +{id: 223, x: 506, y: 121, count:90},
  844 +{id: 224, x: 499, y: 113, count:90},
  845 +{id: 225, x: 491, y: 105, count:90},
  846 +{id: 226, x: 483, y: 97, count:90},
  847 +{id: 227, x: 475, y: 91, count:90},
  848 +{id: 228, x: 466, y: 84, count:90},
  849 +{id: 230, x: 458, y: 78, count:90},
  850 +{id: 231, x: 450, y: 72, count:90},
  851 +{id: 232, x: 441, y: 67, count:90},
  852 +{id: 233, x: 433, y: 62, count:90},
  853 +{id: 234, x: 425, y: 58, count:90},
  854 +{id: 235, x: 519, y: 110, count:90},
  855 +{id: 236, x: 510, y: 101, count:90},
  856 +{id: 237, x: 501, y: 93, count:90},
  857 +{id: 238, x: 492, y: 84, count:90},
  858 +{id: 239, x: 484, y: 77, count:90},